Mysql 数据库-设计一个;事件“;桌子
在阅读了本文的技巧之后,我提出了一个表模式,它可以将高度易失性的数据与其他需要大量读取的表分开,同时减少整个数据库模式中所需的表的数量,但是,我不确定这是否是一个好主意,因为它不符合规范化规则,我想听听您的建议,以下是总体思路:Mysql 数据库-设计一个;事件“;桌子,mysql,database,database-design,relational,partitioning,Mysql,Database,Database Design,Relational,Partitioning,在阅读了本文的技巧之后,我提出了一个表模式,它可以将高度易失性的数据与其他需要大量读取的表分开,同时减少整个数据库模式中所需的表的数量,但是,我不确定这是否是一个好主意,因为它不符合规范化规则,我想听听您的建议,以下是总体思路: 我在一个结构中建模了四种类型的用户,在主“用户”表中,我存储了所有用户共有的数据(id,username,password,几个标志,…),以及一些时间戳字段(创建日期,更新日期,激活日期,上次登录日期,…) 引用上述Nettuts+文章中的技巧#16: 示例2:您有
我在一个结构中建模了四种类型的用户,在主“用户”表中,我存储了所有用户共有的数据(
id
,username
,password
,几个标志
,…),以及一些时间戳
字段(创建日期
,更新日期
,激活日期
,上次登录日期
,…)
引用上述Nettuts+文章中的技巧#16:
示例2:您有“最后一次登录”
字段。它会在每个
用户登录网站的时间。
但表上的每次更新都会导致
要删除的表的查询缓存
冲洗。你可以将该字段放入
另一个表,用于保存您的
将用户表设置为最小值
现在它变得更加棘手,我需要跟踪一些用户统计数据,如
- 查看用户配置文件的次数唯一次数
- 来自特定类型用户的广告被点击的次数
- 查看特定类型用户的帖子的次数
- 等等
事件”
”表:
基本上,ID
指的是主键(ID
)在表中的字段
表中,我相信剩下的应该是非常简单的。在这个设计中,我喜欢的一点是,我可以跟踪所有用户登录,而不仅仅是最后一个,从而用这些数据生成一些有趣的指标
由于事件
表的不断增长,我还考虑进行一些优化,例如:
- #9:由于只有有限数量的表和有限(且预先确定)数量的事件,因此可以将
和表
列设置为事件
而不是枚举
以节省一些空间VARCHAR
- #14:使用
而不是INET_ATON()
s将VARCHAR
s存储为IP
sUNSIGNED INT
- 将
s存储为日期
s而不是时间戳
s日期时间
- 使用
(或存档
?)引擎,而不是CSV
/InnoDB
。MyISAM
- 仅支持
s和INSERT
s,并且动态压缩数据SELECT
- 仅支持
- 能够存储更详细的数据(如登录)
- 无需设计(和编码)几乎十几个额外的表(日期和统计数据)
- 减少每个表的几列,并保持易失性数据分离
- 非关系(仍然没有EAV那么糟糕):
SELECT*FROM events,其中id=2,table='user'ORDER BY date DESC();
- 每个事件的开销为6字节(
,ID
和表
)事件
我更倾向于采用这种方法,因为利大于弊,但我还是有点不情愿……我遗漏了什么吗?你对此有何看法? 谢谢!
@酷客: 有一件事我做得很轻微 不同的是要保持 实体_类型表,并在中使用其ID 对象类型列(在您的示例中, “表”列)。您可能希望 对事件类型执行相同的操作 桌子 为了清楚起见,您的意思是我应该添加一个额外的表来映射表中允许的事件,并在事件表中使用该表的主键,而不是使用
表
/事件
对
@本: 这些统计数据都是从 现有的数据,不是吗 其他表格主要与统计数据相关,但我认为数据不存在,例如:
user_ad_stats user_post_stats
------------- ---------------
user_ad_id (FK) user_post_id (FK)
ip ip
date date
type (impressed, clicked)
如果我删除这些表,我就无法跟踪谁、什么或什么时候,也不知道视图在这里有什么帮助
我同意它应该是分开的,
但更多是因为它从根本上
不同的数据。某人是什么和
一个人所做的是两种不同的事情
我不认为波动性是如此
重要的
我听过两种说法,但在MySQL手册中找不到任何一种说法是正确的。无论如何,我同意你的观点,它们应该是分开的表,因为它们代表各种数据(还有比常规方法更具描述性的好处)
我想你已经错过森林了
可以说是树
表的谓词为
“时间日期时来自IP的用户ID
“到桌上”似乎
有道理,但也有问题
我对“没有EAV那么糟糕”的意思是,所有记录都遵循线性结构,并且它们非常容易查询,没有层次结构,因此所有查询都可以通过简单的SELECT
完成
关于你的第二句话,我想你在这里理解错了;IP地址不一定与用户相关。表结构应该如下所示:
IP地址
user_ad_stats user_post_stats
------------- ---------------
user_ad_id (FK) user_post_id (FK)
ip ip
date date
type (impressed, clicked)
id
object_id
event_id
event_time
ip_address