为产品变体设计数据库

5
我想建模产品变体(不是选项或属性,只是变体)。
因此,每个变体本身都是一个产品。适用于某个产品所有变体的通用信息存储在另一个表中(例如:文本描述)。这样做已经很好了,不需要进一步更改。
对于依赖选项(例如颜色:红色,尺码:小号),我创建了两个变体。
变体1:
图1
表的简短描述:
- 选项:存储所有可用选项(颜色、尺码、材料等) - 值:存储所有可用值(红、蓝、绿、小、中、大、铁、木头) - 选项值:存储所有可能的选项和值的组合(颜色:{红、蓝、绿},尺码:{小、中、大},...) - 产品选项值现在将产品与其选项连接起来(例如:颜色:红色,尺码:小号,产品ID:1;颜色:蓝色,尺码:小号,产品ID:1)
这样做已经足够好了——左边是构建UI所需的元数据(哪些选项、哪些值、哪些组合),右边是与产品的联系。
但是有一个问题……选项和值的可能组合被描述为构建GUI所需,并且可以通过编程方式进行验证,但是数据库无法进行验证。
因此,我创建了变体2:
图2
现在我不确定第二个解决方案是否更好。你认为有改进的余地吗?

关于数据完整性和级联更新/级联删除,这取决于您想要实现什么。顺便说一下,您的结构看起来像一个轻量级的EAV模型。 - Mihai Stancu
如果在MySQL上需要高度动态的结构,EAV是唯一的解决方案,因为DDL语句不是事务性的。 - Mihai Stancu
MSSQL有稀疏列,PostgreSQL有其键/值存储,PostgresDynamic将键/值存储与更简单的语法集成。如果您想使用老式的即时创建/修改表格,它们都具有事务性DDL。 - Mihai Stancu
MySQL没有提供这样有用的功能 :-/ - Franz Bruckner
MariaDB(Oracle接管MySQL后的分支)有一些新的引擎。例如,它将Sphinx搜索引擎集成为存储引擎。但是据我所知,还没有动态键/值存储。 - Mihai Stancu
显示剩余2条评论
1个回答

1
如果您想将product_option_value 仅限于已存在于option_value中的值,则第二个模型是更好的选择。
然而,这个模型允许单个值在多个选项之间共享(例如,“红色”既可以是“颜色”也可以是“尺寸”)。我猜这不是您想要的,那么模型应该看起来像这样:

enter image description here


1
有些产品可能由许多部分组成,每个部分都可以着不同的颜色。因此,当我们有三个部分时,我们会得到三个颜色选项,每个选项提供相同的值(颜色)。 - Franz Bruckner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接