1

我想为论坛网站创建一个数据库...

论坛网站的所有用户都将存储在一个名为 USERS 的表中,其中包含以下字段:

user_name
user_ID
(and additional details)

将有一个名为 FORUMS 的表,其中包含以下字段:

forum_ID
forum_creatorID(which is the ID of one of the users)
forum_topic
replies
views

对于创建的每个论坛(对于 FORUMS 表中的每一行),都会有一个名为 "forum_ID"_replies 的单独表,其中该论坛的确切 forum_ID 将在引号内替换......
因此,每个论坛将有一个单独的表格,其中将保存该特定论坛的所有回复......

“forum_ID”_replies 表中的字段是

user_ID
user_name
comment
timestamp(for the comment)

我希望我的设计清楚......现在,我的疑问是

我将 user_name 保存为每个 "forum_ID"_replies 中的字段之一。但是,我认为 user_name 可以使用 user_ID 从 USERS 表中引用(或访问),而不是将其存储在每个“forum_ID”_replies 表中。以这种方式,减少了冗余。

但是,如果在每个表中都存储了 user_name,则对 user_name 的搜索将会减少,并且可以更快地显示结果。

哪个更优?

存储名称及其 ID 以加快访问速度,还是仅存储 ID 以避免冗余?

4

1 回答 1

2

“最佳”、“更好”等都是主观的。

大多数数据库设计人员都会对您的建议有几个问题。

数据库规范化建议不要复制数据 - 有充分的理由。如果您的用户更改了他们的用户名,会发生什么?您必须更新用户表,但还要找到他们的用户名出现的所有“forum_id”_replies 表;如果你把它搞砸了,突然之间,你就有一个相当明显的错误——人们认为他们在回复“bob”,但他们实际上是在回复“jane”。

从性能的角度来看,除非您有深奥的性能需求(例如,您正在运行 Facebook),否则与用户表的连接不会产生可衡量的影响 - 您正在连接主键列,这就是数据库真的,真的很擅长。

最后,为每个论坛创建单独的表并不是一个好主意,除非你有巨大的性能/可扩展性需求(阅读:你是 Facebook)——维护数据库、构建查询、将应用程序连接到数据库等方面的额外复杂性。很重要;在单个表中存储多个论坛的性能开销通常不会。

“更好”取决于您的标准。如果(正如您在评论中所写)您担心可扩展性并支持大量帖子,我的建议是从构建一种测试和测量可扩展性级别的方法开始。一旦你可以测试和测量,你就可以测试不同的解决方案,并知道它们是否有实质性的影响——这通常会显示出违反直觉的结果。性能优化通常以牺牲其他标准为代价 - 例如,您的设计更容易出错(重复信息意味着您可能会得到差异)并且编码成本更高(编写逻辑以加入每个论坛的不同表)。如果您无法证明它在可扩展性方面具有实质性好处,并且这种好处满足您的业务需求,那么您可能是在浪费时间和金钱。

您可以使用 DBMonster 等工具用测试数据填充数据库,并使用 JMeter 运行大量并发数据库查询 - 使用这些工具尝试两种解决方案,看看您的解决方案是否确实更快。

于 2013-02-12T17:31:14.900 回答