我正在尝试构建存储多个用户消息的数据库。每个用户将能够发送/接收5种不同的消息“类型”(严格来说,标签,实际数据类型将是相同的)。我最初的想法是为每个用户创建多个表,代表5种不同的消息类型。我很快就知道这不是一个好主意。我的下一个想法是为每个消息类型创建一个包含用户列的表,但我不确定这是从性能角度来看最好的方法。如果用户1发送100个消息类型1,而用户3只发送10,会发生什么?其余的字段将是空值,我真的不确定这是否有所作为。思考?建议和/或建议阅读?先谢谢你!数据库设计:每个用户多个表
回答
不,(在这个问题上的主题给出的主意)将极大地低效。每次创建新用户时都需要引入一个新表,并且一次查询所有这些表将成为一场噩梦。
用单个表来存储关于消息的信息要容易得多。该表中的每一行都将对应于一个且仅有的消息。
此外,此表应该可能有三个'引用'列:两个用于将特定消息链接到其发送者和接收者,另一个用于存储其类型,只能分配有限的一组值。
例如:
MSG_ID | SENDER_ID | RECEIVER_ID | MSG_TYPE | MSG_TEXT
------------------------------------------------------
1 | 1 | 2 | 1 | .......
2 | 2 | 1 | 1 | #######
3 | 1 | 3 | 2 | $$$$$$$
4 | 3 | 1 | 2 | %%%%%%%
...
这将是很容易得到双方的所有消息由有人送(与WHERE sender_id = %someone_id%
条款),发送到有人(WHERE receiver_id = %someone_id%
),某些特定类型的(WHERE msg_type = %some_type%
)。但最好的是,可以轻松地将这些子句组合起来,以设置更复杂的过滤器。
您最初以为,似乎什么,看起来是这样的:
IS_MSG_TYPE1 | IS_MSG_TYPE2 | IS_MSG_TYPE3 | IS_MSG_TYPE4
---------------------------------------------------------
1 | 0 | 0 | 0
0 | 1 | 0 | 0
0 | 0 | 1 | 0
它可以是NULL
!而非0
,其核心仍然是相同的。它坏了。是的,您仍然可以通过WHERE is_msg_type_1 = 1
条款获得单一类型的所有消息。但即使是获得某种特定信息这样简单的任务也变得不那么容易:您必须检查这5个列中的每个,直到找到具有truthy
值的那个为止。
类似的困难,指望谁试图计算每个类型的消息的数量的一个(这几乎是琐碎的结构上面给出:。COUNT(msg_id)... GROUP BY msg_type
所以,请不要这样做),除非你有一个非常有力的理由,不要试图构建你的桌子,以便随着时间的推移,他们的身高会增加 - 而不是宽度。
完美。我现在不仅了解了什么,而且还了解了为什么。谢谢! – user2442072
其余字段将是空值
,除非你是垂直设计数据库,将不会有剩余的字段。
user int
msgid int
msg text
create table `tv_ge_main`.`Users`(
`USER_ID` bigint NOT NULL AUTO_INCREMENT ,
`USER_NAME` varchar(128),
PRIMARY KEY (`ID`)
)
create table `tv_ge_main`.`Message_Types`(
`MESSAGE_TYPE_ID` bigint NOT NULL AUTO_INCREMENT ,
`MESSAGE_TYPE` varchar(128),
PRIMARY KEY (`ID`)
)
create table `tv_ge_main`.`Messages`(
`MESSAGE_ID` bigint NOT NULL AUTO_INCREMENT ,
`USER_ID` bigint ,
`MESSAGE_TYPE_ID` bigint ,
`MESSAGE_TEXT` varchar(255) ,
PRIMARY KEY (`ID`)
)
- 1. 多个用户数据库设计
- 2. 数据库设计麻烦。每个用户的表格
- 3. MySQL数据库设计:一个用户表,两个用户组?
- 4. 如何为多个用户设计数据库表(MySQL)?
- 5. Postgresql - 每个用户一个数据库或每个用户一个数据库
- 6. 数据库设计:如何查询多个表到多个表
- 7. 设计每个商店多个价格的数据库结构
- 8. CMS数据库设计 - 每个站点的主数据库或多个Db
- 9. 多表数据库设计
- 10. 多用户数据库设计
- 11. 数据库设计:多用户类型
- 12. 数据库设计 - 一个表或多个表/连接
- 13. 数据库设计:多个表对一个表
- 14. 数据库设计 - 一个链接表或多个链接表?
- 15. 数据库设计 - 一个数据库,多个网站
- 16. 每个用户一个数据库
- 17. 面向多个用户的CRM数据库设计
- 18. 针对多个用户属性的数据库设计
- 19. 相当大(400k)mysql数据库设计为多个用户
- 20. 针对多个用户站点的数据库设计
- 21. Symfony2多个数据库,为每个表指定数据库
- 22. 每个数据库实例有一个或多个用户?
- 23. 单一数据库与多个数据库的应用设计
- 24. 数百个表的数据库设计
- 25. 多个模型的数据库设计?
- 26. 使用这个数据设计一个数据库表
- 27. 数据库设计 - 何时将数据分成多个表?
- 28. 每个数据库一个用户vs所有数据库的单个用户
- 29. 数据库设计用户表拆分或单个
- 30. 多用表的数据库设计
http://pragprog.com/book/bksqla/sql-antipatterns – dm03514