数据库设计:新增表 vs 新增列

9
当前有一个表格,需要开始向其中添加新的数据列。即使在添加新数据列后,也不是每条记录都会有数据。因此,我想知道是否更适合使用新表格来扩展一些数据行,而不适用于每一行。
换句话说,由于这些新数据元素将有很多未使用的列,所以似乎更适合使用新表格?
编辑(认为这太有限了)
第一个表格是页面浏览记录(当前200万条记录) - id - IP地址 - 浏览次数 - 创建时间戳 - 日期
对于每个IP地址,每天都会记录一次 - 连续的页面浏览将添加到每天的浏览次数中。
附加字段用于跟踪来源(例如Google Analytics源/媒介/广告系列)。
并非每次访问都会提供该信息。 我会假设约有10%的行将具有数据(因为通常仅归因于第一次访问)。
数据的主要用途是归因于人们来自哪里。这可能会更频繁地使用(然后似乎更适合单个表格)。
感谢反馈-如果需要可以添加更多内容。

1
您应该提供关于数据的性质以及如何使用它的更多信息。您是要检索这些数据还是对其进行筛选?我们谈论的是多少个字段?字段有多大?您目前有多少行,需要新字段的行数有多少? - JNK
你还应该考虑在[dba.se]上询问这个问题——数据库设计问题是那里的核心业务! - JNK
2个回答

12

基本规则是这样的(从更严格的规范化规则简化而来)。

如果属性/列依赖于整个主键并且没有其他依赖,它应该属于该表。

如果它依赖于主键之外的某些东西或者除此之外的其他东西,它应该属于其他地方,并且它所属的表与当前表应该有一个关系。

例如,你的名字取决于你的社会安全号码,因此,如果社会安全号码是主键,你的名字将属于那个表。你的汽车或电话号码不完全依赖于你的社会安全号码(因为你可能有多辆车或电话),因此应该放在另一个表中(你的主要电话号码可能放在第一个表中)。

如果你真的想了解数据库设计,就别关注select命令的语法,而要深入研究规范化。我的建议是,所有数据库模式都应该从3NF开始,只有在需要优化性能时才回退。

而且,只有当你理解(并减轻)这样做所固有的问题时才这样做。


1
感谢所有的输入 - 在阅读了这个帖子和http://dba.stackexchange.com/questions/18399/database-design-new-table-versus-new-columns上的另一个帖子之后,我想出了一个不同的模式,创建了一个访客表和一个访问表。访问表跟踪源信息和访问类型。原始页面视图然后链接到访客和(如果适用)访问,因为并非每个页面视图都会记录访问。 - cgmckeever
我想再举一个例子。考虑一个购物网站。你会在用户表中添加一个地址列,还是创建一个新的表?一个用户可能有多个地址,因此创建一个单独的地址表是更好的设计选择。即使您目前计划允许每个用户只有一个地址,拥有更高的自由度也是很好的选择。 - Efe Zaladin

1
如果大多数列的数据类型为varchar,那么这种方法是可行的。
因为varchar数据类型根据表格单元格中内容的大小来占用表格中的空间。
如果使用SQL Server 2008,则可以将新列定义为SPARSE。 请参考了解有关SPARSE列的优缺点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接