【问题标题】:Database design - double up of data in columns数据库设计 - 列中的数据加倍
【发布时间】:2017-02-22 23:46:09
【问题描述】:

从数据库设计的角度来看,以下哪些是最佳实践?:

如果您需要存储数据记录的类别和子类别(均为整数),我可以看到的选项是:

a) 将类别和子类别存储在单独的字段中(很难一目了然地查看特定子类别的类别)

b) 将两者存储在以句点分隔的同一字段中(数据摘要或类别级别分析需要对每条记录运行一个函数以提取类别)

c) 分别存储 Category 和 Subcategory,但将它们组合在 Subcategory 字段中(即 Category = 1,Subcategory = 1.2)(Category 数据将加倍,并且 Subcategory 可能与类别)

或者是否有其他方法可以被认为是更好的做法?

【问题讨论】:

    标签: mysql sql sql-server database


    【解决方案1】:

    这实际上取决于“类别”和“子类别”将如何使用,它们代表什么。

    我们需要问的一个问题是“类别”在功能上是否依赖于“子类别”。

    即:“子类别”是否“属于”单个“类别”,或者“子类别”是广义的,因为它适用于多个类别?

    在后一种情况下,将“类别”和“子类别”存储为两个单独的列是规范模式。

    在第一种情况下,“类别”在功能上依赖于“子类别”,我们可以只存储“子类别”,而避免将“类别”存储在“记录”中。我们可以将“类别”和“子类别”之间的关系存储在单独的表中,从而对模型进行规范化。

    我们仍然可以选择非规范化模型,并出于性能原因继续冗余存储“类别”列。我们只需要识别冗余,并采取措施确保一致性:确保“记录”中存储的“类别”与“记录”中存储的“子类别”相关联的“类别”匹配。


    不同的表示可能有一些很好的理由,以不同的方式存储“类别”和“子类别”的值。但是,如果不知道如何使用这些值,如果没有对用例的一些描述,我们就无法提出该建议。

    【讨论】:

    • "以确保存储在“记录”中的“类别”与与“子类别”相关联的“类别”相匹配” - 定义一个引用 subcategeries(category, subcategory) 的 FK records(category, subcategory) 并让RDBMS 检查一致性。这同样适用于多对多表。
    • 我认为从广义上讲,这是一个很好的答案。我认为唯一的额外考虑是类别和子类别是否具有某种参差不齐的层次结构,在这种情况下,该场景的建模看起来不同。
    • @BradD:是的,很好。数据分析和实体关系建模是关系数据库设计的关键。从提出的相当笼统的问题来看,我们并不真正知道“数据记录”、“类别”和“子类别”真正代表什么。这些只是标签。我们注意不要仅仅从可能的表示建议中推断出语义规则给这些标签带来负担。更彻底的分析将引导我们发现实际需求,并在此基础上做出表示决策。
    • @spencer7593 你是对的 - 我没有在问题中指定类别和子类别之间的关系。我应该指定子类别在功能上与类别相关 - 每个子类别都有一个相关类别,基本上只是更高级别的细节。
    【解决方案2】:

    您已经阐述了交流电的优缺点。

    如果您不简单地允许猫和子猫的任何和所有组合, 我宁愿做以下事情:

    有一张桌子categories 和一张桌子sub-categories。 然后有一张表cat_subcat 将它们组合在一起——但只有有效的组合。 cat_subcat 有自己的 id。这些是您引用它们时的唯一参考。

    我个人确实更喜欢特殊的子类别none,而不是任何使用 null 或其他特殊处理的方法。

    【讨论】:

      【解决方案3】:

      第一个选项是最佳实践。对称为“规范化”的东西进行一些研究。我喜欢this guy。为了使数据库处于第一范式,数据需要是原子的。

      【讨论】:

        猜你喜欢
        • 2013-12-16
        • 2016-12-10
        • 2011-09-30
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        相关资源
        最近更新 更多