我有一堆产品,每个产品都有一堆不同的可能属性。例如,产品 A 有名称、尺寸、颜色、形状。产品 B 有名称、卡路里、糖分等。解决此问题的一种方法是:
1) 创建表
Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
这允许最大的灵活性,但我听说很多人反对这样做,尽管我不知道为什么。我的意思是,如果这些表被称为 Teams、Players、Team_Players,我们都会同意这是正确的关系设计。
每个向我解释为什么这很糟糕的人都是在完全灵活的关系设计的上下文中这样做的,在这种设计中,您永远不会通过基本的几个基本初始表(例如 object、attribute、object_attribute)创建真正的表——我认为我们所有人都同意是坏的。但这是一个更受限制和包含的版本(只有产品,而不是系统中的每个对象),所以我认为将这两种架构组合在一起是不公平的。
你遇到了什么问题(经验或理论)使这个设计如此糟糕?
2)解决这个问题的另一种方法是创建一个 Product 表,其中包含一堆列,如大小、颜色、形状、重量、糖等,然后在最后包含一些额外的列,以给我们一些灵活性。这将创建通常由 NULL 填充的稀疏行。人们倾向于喜欢这种方法,但我的问题是,在这种方法失去其性能优势之前,您可以拥有多少列?如果你有 200 列,我想这不再是明智之举,但是 100 列呢?50列?25列?
3) 我知道的最后一种方法是将所有属性作为 blob(也许是 JSON)存储在 Products 表的单个列中。我喜欢这种方法,但感觉不对。查询很难。而且,如果您希望以后能够轻松更改属性的名称,则必须单独解析每条记录,或者通过某个 id 将它们键入您的 blob。如果您使用 id 路径,那么您将需要另一个表 Attributes 并且事情开始看起来像上面的方法#1,除了您将无法将 attribute_id 与您的 blob 连接,所以我希望您不想查询任何内容按属性名称。
我喜欢这种方法的地方在于您可以查询一个产品,并且在您的代码中您可以轻松地访问它拥有的所有属性——快速。而且,如果您删除了一个产品,您就不必清理其他表——很容易保持一致。
4) 我已经阅读了一些关于能够在某些 RDBMS 中索引强类型 xml 格式的内容,但老实说,我对这种方法知之甚少。
我被困住了。我觉得方法 #1 是最好的选择,但我读到的所有内容都这么说很臭。思考这个问题的正确方法是什么,以便能够决定在给定情况下什么是最佳方法?显然欢迎比我列出的更多的想法!