我想为一个论坛网站创建一个数据库...
论坛网站的所有用户都将存储在一个名为users的表中,表中包含以下字段:
user_name
user_ID
(and additional details)将有一个名为论坛的单个表,其中包含以下字段:
forum_ID
forum_creatorID(which is the ID of one of the users)
forum_topic
replies
views对于创建的每个论坛(对于论坛表中的每一行),将有一个单独的表名为" forum_ID "_replies,其中将在引号中替换该论坛的确切forum_ID...
因此,每个论坛将有一个单独的表,其中将保存该特定论坛的所有回复……
"forum_ID"_replies表中的字段为
user_ID
user_name
comment
timestamp(for the comment)我希望我把我的设计说清楚了..。现在,我的疑问是
我将user_name保存为每个"forum_ID"_replies中的一个字段。但是,我认为可以使用user_ID从USERS表引用(或访问) user_name,而不是将其存储在每个"forum_ID"_replies表中。这样就减少了冗余。
但是,如果将user_name存储在每个表中,则将减少对user_name的搜索,并且可以更快地显示结果。
哪一种更理想?
存储姓名及其ID以加快访问速度,还是仅存储ID以避免冗余取消?
发布于 2013-02-13 01:31:15
“最优”、“更好”等都是主观的。
大多数数据库设计人员都会对您的提案有几个问题。
Database normalization建议不要复制数据-这是有充分理由的。如果您的用户更改了他们的用户名,会发生什么?您必须更新用户表,但还要找到用户名出现的所有"forum_id"_replies表;如果您搞砸了,突然之间,您就会有一个相当明显的bug --人们认为他们回复的是"bob",但实际上他们回复的是"jane“。
从性能的角度来看,除非您有深奥的性能需求(例如,您正在运行Facebook),否则连接到user表将不会有可测量的影响-您是在主键列上连接,而这正是数据库非常非常擅长的。
最后,为每个论坛创建单独的表并不是一个好主意,除非你有巨大的性能/可伸缩性需求(例如:你是Facebook) -维护数据库、构建查询、将应用程序连接到数据库等方面的额外复杂性是显著的;在一个表中存储多个论坛的性能开销通常不是很大。
“更好”取决于你的标准。如果(正如你在评论中所写的那样)你关心可伸缩性和支持大量的帖子,我的建议是从构建一种测试和测量可伸缩性级别的方法开始。一旦您可以测试和测量,您就可以测试不同的解决方案,并知道它们是否具有实质性影响-通常,这会显示与直觉相反的结果。性能优化通常以牺牲其他标准为代价-例如,您的设计更容易出错(重复的信息意味着您可能会得到差异),并且编码成本更高(编写逻辑以连接到每个论坛的不同表)。如果您不能证明它在可伸缩性方面有实质性的好处,并且这种好处满足了您的业务需求,那么您可能是在浪费时间和金钱。
您可以使用DBMonster等工具向数据库填充测试数据,使用JMeter运行大量并发数据库查询-使用这些工具尝试这两种解决方案,看看您的解决方案是否真的更快。
https://stackoverflow.com/questions/14837322
复制相似问题