据说我有一个产品表:
身份证 | 产品名称 |
---|---|
1 | 牛仔裤衬衫 |
2 | 馅饼 |
除了具有以下选项的产品变体:
id | 产品_id | 名字 |
---|---|---|
1 | 1 | 颜色 |
2 | 2 | 味道 |
所以,我想存储一组属性
牛仔裤衬衫:生产日期、材质、图案设计、款式、产地、季节(秋、夏、春、冬)
馅饼:建议年龄、成分、食物类型、口味、生产日期、失效日期)
有了这一切,我想出了:
身份证 | 产品名称 | 属性集 |
---|---|---|
1 | 牛仔裤衬衫 | [生产日期、材质、...] |
2 | 馅饼 | [建议年龄、成分、食物类型、...] |
身份证 | 产品_id | 属性名称 |
---|---|---|
1 | 1 | 生产日期 |
2 | 1 | 材质 |
.. | ... | .... |
11 | 2 | 建议年龄 |
12 | 1 | 成分 |
我打算带来的所有设置属性都是默认值,这意味着所有属性都基于产品,管理员不能对其进行 CRUD 吗? 所以我想知道电商数据库设计时什么样的情况才合理?
您需要考虑打算如何存储这些值。如果解决方案 1 中的那些数组实际上是文本值(varchar 等),那么请再考虑一下。您可能需要统计数据并轻松搜索各个项目,因此您需要遵守 1NF 并避免字段包含多个元素。
当然,一些 RDBMS 系统允许数组类型,这是一种替代方案(示例:https://www.postgresql.org/docs/current/arrays.html),但你很容易遇到麻烦元素的数量,或者如果这些元素不仅仅是您存储在数组中的值,则需要详细说明这些元素,并且您将在语义上相同但技术上不同的值方面遇到很多麻烦,例如制造日期与制造日期。因此,在单独的表中为属性预定义可能的值是有意义的,并且值的所有使用都将通过它们的 id 完成,因此您将把属性名称存储在一个位置,并且更改这些值将是微不足道的,没有危险由于冗余而导致不一致。如果您最终需要它,您还将难以在不同类型的 RDBMS 之间迁移数组值,或者在同一 RDBMS 的旧版本中使用数组。
因此,出于理论和实践原因,您可以选择以下设置:
属性 |身份证 |名称 | | -------- | -------- | | 1 |生产日期| | 2 |材质|
和
产品属性 |身份证 |产品 ID |属性ID | | -------- | -------- | -------- | | 1 | 1| 1 | | 2 | 1|2| | ..| ...| ....| | 11 | 11 2| 3 | | 12 | 12 1|4|