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:您有“最后一次登录” 字段。它会在每个 用户登录网站的时间。 但表上的每次更新都会导致 要删除的表的查询缓存 冲洗。你可以将该字段放入 另一个表,用于保存您的 将用户表设置为最小值

现在它变得更加棘手,我需要跟踪一些用户统计数据,如

  • 查看用户配置文件的次数唯一次数
  • 来自特定类型用户的广告被点击的次数
  • 查看特定类型用户的帖子的次数
  • 等等
在我的完全规范化数据库中,这会增加大约8到10个额外的表,这不是很多,但如果可以的话,我想让事情简单一些,因此我提出了以下“
事件”
”表:

基本上,
ID
指的是主键(
ID
)在
表中的字段
表中,我相信剩下的应该是非常简单的。在这个设计中,我喜欢的一点是,我可以跟踪所有用户登录,而不仅仅是最后一个,从而用这些数据生成一些有趣的指标

由于
事件
表的不断增长,我还考虑进行一些优化,例如:

  • #9:由于只有有限数量的表和有限(且预先确定)数量的事件,因此可以将
    事件
    列设置为
    枚举
    而不是
    VARCHAR
    以节省一些空间
  • #14:使用
    INET_ATON()
    而不是
    VARCHAR
    s将
    IP
    s存储为
    UNSIGNED INT
    s
  • 日期
    s存储为
    时间戳
    s
    而不是
    日期时间
    s
  • 使用
    存档
    (或
    CSV
    ?)引擎,而不是
    InnoDB
    /
    MyISAM
    • 仅支持
      INSERT
      s和
      SELECT
      s,并且动态压缩数据
总的来说,每个事件只消耗14(未压缩)字节,我想这对我的流量来说是可以的

赞成的意见:
  • 能够存储更详细的数据(如登录)
  • 无需设计(和编码)几乎十几个额外的表(日期和统计数据)
  • 减少每个表的几列,并保持易失性数据分离
欺骗:
  • 非关系(仍然没有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