【问题标题】:Database Design: New Table versus New Columns数据库设计:新表与新列
【发布时间】:2012-05-25 12:36:49
【问题描述】:

目前有一个表..需要开始向其中添加新的数据列。 并非每条记录(即使在添加新数据列后继续使用新数据)都会有数据。所以我想知道这是否更适合新表,因为它实际上是某些数据行的扩展,并不适用于每一行。

换句话说,由于这些新数据元素会有很多未使用的列,看起来这更适合新表?

编辑(认为这太有限了)

第一个表是页面浏览量的记录(目前200万条记录) - ID - IP地址 - 浏览次数 - created_at 时间戳 - 日期

对于每个 IP 地址,每天都会创建一个记录 - 连续的网页浏览量会添加到每天的浏览次数中

附加字段将用于跟踪来源(即谷歌分析来源/媒体/活动)

并非每次访问都会获得该信息。 我会假设大约 10% 的行将包含数据(因为它通常只在第一次访问时归因)

数据的主要用途是确定人们来自哪里。这可能会被更频繁地使用(然后似乎适合单个表)

感谢反馈 - 如果需要可以添加更多

【问题讨论】:

  • 您应该提供更多有关数据性质以及如何使用数据的信息。您会检索这些数据还是对其进行过滤?我们在谈论多少个领域?田地有多大?您目前有多少行,有多少行需要新字段?
  • 您还应该考虑在Database Administrators 上提问 - 数据库设计问题是我们的生计!

标签: sql database


【解决方案1】:

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

如果属性/列依赖于整个主键而不依赖其他任何东西,则它属于表。

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

例如,您的姓名取决于您的 SSN,因此,如果 SSN 是主键,您的姓名将属于该表。您的汽车或电话号码完全取决于您的 SSN(因为您可能有不止一部汽车或电话,所以它会放在不同的表中(您的主要电话数字可能会出现在第一个表中)。

如果您真的想了解数据库设计,请忘记select 命令的语法,看看规范化。我对其他人的建议是所有数据库模式应该从 3NF 开始,并且只有在性能需要时才恢复。

然后,只有当您了解(并减轻)这样做的固有问题时。

【讨论】:

  • 感谢所有输入 - 在阅读了此线程和 dba.stackexchange.com/questions/18399/… 的其他内容之后,我想出了一个不同的架构,它创建了一个访问者表和一个访问表。访问表跟踪源信息和访问类型。然后原始页面视图链接到访问者和(如果适用)访问,因为并非每个页面视图也会记录访问
【解决方案2】:

如果大部分列的数据类型为varchar,则该方法很好。

因为varchar数据类型根据表格单元格中内容的大小占用表格空间。

如果使用 Sql server 2008,您可以将新列定义为 SPARSE。

Refer to know more about pros and cons of SPARSE Column

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多