【发布时间】:2012-03-17 22:56:45
【问题描述】:
我认为有必要为用户通知去规范化数据库。例如,在标记帖子时(应该由用户考虑),我们添加一列flag ENUM('yes', 'no')(或状态列)。可以通过 user_id='XX' AND flag='yes' 的 WHERE 子句计数来为用户查找标记的事件。
这种归一化的结构很好;但是如果我们有不同类型的通知呢?例如帖子,cmets,照片的标志......这意味着当用户刚刚访问他的个人资料页面时,我们需要计算几个表。这对于像 stackexchange 这样的跨项目来说更为严重,因为我们会收到不同站点的通知。
我认为去规范化可以帮助将通知列添加到用户表中
post_flags tinyint(3),
comment_flags tinyint(3),
photo_flags tinyint(3),
在这种情况下,我们需要运行一个额外的写入查询来更新每个相应操作的用户标志列。例如,标记帖子时:UPDATE users SET post_flags=post_flags+1 WHERE user_id='XX'。我关心的是确保执行后一个查询,以避免此数字与标记帖子的计数不匹配;但我认为它可以通过TRANSACTION 保护。
通过这种方式,我们可以通过一次查询频繁访问的个人资料页面获得所有通知。
我在正确的轨道上吗?还是为此目的常用另一种棘手的方法?
【问题讨论】:
-
你要在
tinyint(3)中存储什么?不是有多个条目吗? -
通知的数量。例如,在标记帖子时,我们将运行
UPDATE users SET post_flags=post_flags+1 WHERE user_id='XX'的查询 -
"flag ENUM('yes', 'no')" - 为什么不使用 1 和 0 进行 INT?
-
ENUM 有什么问题?它们都使用相同的存储大小执行相同的操作。
-
枚举不是 SQL。不同的平台以不同且不兼容的方式支持它。 AFAIK,主流商业 dbms 根本不支持它。 MySQL 和 PostgreSQL 以不同且不兼容的方式支持它。对枚举的更改需要更改架构;对由外键引用相关的表的更改只需要插入一行。 8 Reasons Why MySQL's ENUM Data Type Is Evil 是相关的。
标签: mysql sql normalization denormalization denormalized