数据库设计 - 列中数据加倍

时间:2017-02-22 23:46:09

标签: mysql sql sql-server database

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

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

a)将类别和子类别存储在不同的字段中(很难看出特定子类别的类别一目了然)

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

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

还是有另一种方法被认为是更好的做法吗?

3 个答案:

答案 0 :(得分:3)

这实际上取决于'类别'和'子类别'将被使用,这些代表什么。

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

那就是:'子类别' "属于"单个'类别'或者是'子类别'一般化,因为它适用于多个类别?

在后一种情况下,然后存储'类别'和'子类别'因为两个独立的列是规范模式。

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

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

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

答案 1 :(得分:2)

第一种选择是最佳做法。做一些关于“正常化”的研究。我喜欢this guy。要使DB处于第一范式,数据必须是原子的。

答案 2 :(得分:2)

你已经确定了a-c的优点和缺点。

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

拥有表格categories和表格sub-categories。 然后有一个表cat_subcat将它们组合在一起 - 但只有有效的组合。 cat_subcat拥有自己的ID。这些用作引用它们时的唯一参考。

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