是否为不同的产品类型创建单独的表?

pay*_*ing 25 database-design database-recommendation

我正在设计一个数据库,我正在重新考虑我最初的设计决定......

产品类型如下... 型号、零件、替换零件套件和选项。

选项 A(第一个设计):我计划为上述产品类型设置单独的表格。我想说每个表中大约 75% 的字段是相同的。

我将每个产品类型创建为单独的表,因为我需要在它们之间创建关联。例如,一个模型可以有很多选项,一个选项可以有很多模型。一个选项也可以有很多部分,一个部分可以有很多选项……等等……

选项 B:我可以创建一个名为 Product 的表格,而不是单独的表格,其中包含模型、零件、替换零件套件和选项。我可以有一个称为 type 的字段来区分模型、选项等。我认为不利的一面是某些产品类型永远不会使用几个字段(留空)。我猜这就是“非最佳实践”发挥作用的地方。

选项 B 将大大降低数据库设计的复杂性。在提取数据进行查询时,我也不必担心引用一堆表......

Der*_*ney 8

如果这是我的设计决定,我可能会选择更多的“选项 C”(修改后的选项 a)。

首先,为什么不选择“选项 B”:

一方面,我喜欢每个产品都有自己的桌子提供的清晰度。如果都是一张大表,有一个字段来确定类型,那么关系就不那么清楚了。

另一方面,索引策略将始终要求列出该类型字段。由于只有4种类型,所以索引基数极低(SELECT * FROM product_table WHERE type='X'反正基本上都是做全表扫描的)

选项 C

  • 创建一个仅包含所有类型共享的列的父表
  • 将每种产品类型创建为自己的表,并带有单独的列,还有一个额外的:指向父表的链接
  • 创建每个“链接”表:Product_Option、Model_option 等,并带有指向相应键的链接。
  • 对于那些具有互惠链接(MODEL_OPTION、OPTION_MODEL)的人,也请继续创建这些表。这将为任何查看它的人增加联接的清晰度。

缺点是确保在更新/删除事物时避免孤立以及最初设计使用这些表的查询的复杂性。

  • 现在只有 4 种类型,但是如果以后添加更多呢?我确定亚马逊的主要产品表最初被称为“书籍”,但您认为他们现在为每种产品类型都有一个单独的表吗?我不认为每种类型都应该有自己的表,但您可以使用 EAV 模型来获取每种类型可能具有的共同属性。 (5认同)

Mar*_*ith 7

我建议您从“正确”的关系模型开始,您的选项 A。如果该模型的典型用法导致您在某些领域进行非规范化,请不要害怕这样做。

上周我和一位同事讨论了模式设计如何通常被认为是一成不变的东西,永远不会改变。奇怪的是,考虑到重构在应用程序的每个其他层中是如何被接受的实践,重构数据库模式仍然被认为是不切实际的。

如果数据库接口设计得很好,那么当您了解更多关于系统使用模式的信息时,没有什么可以阻止您调整模式。