【问题标题】:Is separating common data is good in my case? [closed]在我的情况下,分离常见数据是否合适? [关闭]
【发布时间】:2011-09-17 06:45:45
【问题描述】:

因此,例如,我有 City 列。 95% 的 City 值为 NULL。制作像 city_names(Id PK, City) 这样的表并将 City 替换为新列 City_id (FK 引用 city_names(id))是个好主意吗?这是我对此的看法。它们基于一般的计算思想。请纠正我,这不适用于 RDMS。

第一种方式:O(n) 存储 O(n) 批量操作 O(1) 随机访问

第二种方式:O(n) 存储 O(n * logn) 批量操作,由于对索引结构的 n 个请求(例如,B 树)O(lon n) 随机访问

这是全图。我有 1M 行表。它长大了。像City一样有80列。他们几乎都归零了。但是,它们是社区可编辑的。所以我必须在其中提供全文搜索、快速编辑时间和复杂查询(针对高级用户或机器人)。在某些将来,根本不会有 NULL。所以我必须使用绞盘方案来编辑​​阶段和最终形状的桌子?

如果重要的话,我会使用 postgres\mysql。

【问题讨论】:

  • 我不只要求其中一种解决方案。您可以建议任何技术。
  • 这叫做规范化,是的,这是个好主意...
  • @Mitch Wheat 但我的性能损失很大。此外,会有太多的连接。这里出了点问题,我觉得它被过度设计了。

标签: mysql sql database postgresql database-design


【解决方案1】:

在 PostgreSQL 中,NULLS 几乎没有成本(每个 1 位,一次 8 位,加上字对齐,因此拥有 > 1 NULL 与值相比,它们变得越来越便宜)。

对于像您这样的人口稀少的列,将列移动到自己的表中没有任何好处,并且一直加入以获得该稀疏数据的损失相当大。

【讨论】:

    【解决方案2】:

    因此,例如,我有 City 列。 95% 的 City 值为 NULL。是 这个好主意制作像 city_names(Id PK, City) 这样的表并替换 具有新列 City_id 的城市(FK 引用 city_names(id))?

    如果将 city 列替换为 city_id 列,95% 的行仍将为 NULL,不是吗?您将减少磁盘空间,但您需要为必须返回城市名称的每个查询进行连接。

    用 ID 号替换文本与规范化无关。规范化总是减少原始表中的列数。

    还有一个问题是“城市”本身通常不是城市的全名。您实际上可能需要将两列或三列移动到另一个表中。美国有很多城市被命名为“华盛顿”。事实上,在 1800 年代,有两个城市被命名为“美国加利福尼亚州华盛顿”。对于美国的城市,将城市、州和国家一起移动到一个新表中可能是有意义的。同样,这将减少磁盘空间,但需要对必须返回任何这些列的每个查询进行连接。

    目前,任何查询都可以在不使用连接的情况下返回所有 80 列人类可读的文本。例如,如果您将一半的文本列替换为对其他表中 id 号的外键引用,您可能必须编写具有 40 个连接的查询才能将所有数据恢复到人类可以再次读取的位置。

    在进行需要 40 次联接的更改之前,请三思而后行。

    话虽如此,一个 80 列且 95% 为 NULL 的表不太可能在 BCNF 中,归一化为 BCNF 或 5NF 可能会对您有所帮助。请记住,规范化并不意味着“用 id 号替换该文本”。

    【讨论】:

    • “在进行需要 40 次连接的更改之前,请仔细考虑。”是的。这个。谢谢你的建议。我会阅读更多关于规范化的故事。
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多