基本问题是“如何存储父类的异构子类?”。有很多选择 - 你选择的是混合动力车,这不一定是坏事。
我已经看到了这个主题的最好描述是Craig Larman与书“UML和模式应用” - 虽然他是从面向对象的写入,而不是查看数据库点。
首先第一件事情:你已经设置方式“变种”可能不是你想要的东西 - 它表明,“价格”和“股票”一起运动,而他们的数据非常不同的位。我会考虑将它们分解到自己的表格中 - “variant_price”和“variant_stock”。其次,您选择表示要素的选项通常称为“实体属性值”或EAV。它的主要优势在于允许您在设计时不知道其架构的情况下存储数据,但它会使任何布尔查询陷入巨大的痛苦之中 - 想象一下寻找XL尺寸的所有红色T恤。
有在关系世界3倍的替代品(这是基于Larman与书):每变种
亚型。所以,你创建一个“variant_tshirt”表 大小,颜色等,以及“variant_trouser”有大小,颜色, 腿内侧等,这保持了表很好的和自描述的,但使 您的SQL成一个巨大的烂摊子 - 它必须改变每个子类型。
带有所有可能列的单个表格:在这种情况下,您有一个包含所有子类型的所有可能字段的 单个表格。这样, 你的SQL保持简单得多 - 但表格变得非常糟糕,并且你依赖于你的客户端应用程序“知道”裤子内部腿属性为 ,而T恤衫则不然。
表共同属性 亚型有存储在自己的表其独特的价值。在 这个模型,假设你只有裤子和t =衬衫,你有 一个“变体”表的大小和颜色,和一个“裤子”表内腿 。
每个选项都有优点和缺点 - 尤其是在一个情况下,你不提前知道哪些亚型,你会需要,第一个选项是最简单的数据库结束,而是创建一个位一团糟的客户端代码。
在SQL之外,你可以使用XML - 使用XPath,你可以很容易地执行布尔查询或NoSQL - 但NoSQL在这里不会是我最喜欢的,它们大多数在概念上都是基于键值关系,这使得布尔查询相当困难。
图片的链接已损坏。你介意再把这张照片放进去吗? – Flux