为各种产品类型设计具有多个参数的多功能产品表
P粉658954914
P粉658954914 2023-10-18 17:44:13
0
2
581

我在表格设计方面没有太多经验。我的目标是创建一个或多个满足以下要求的产品表:

  • 支持多种产品(电视、手机、PC...)。每种产品都有不同的参数集,例如:

    • 手机将具有颜色、尺寸、重量、操作系统...

    • PC 将拥有 CPU、HDD、RAM...

  • 参数集必须是动态的。您可以添加或编辑您喜欢的任何参数。

如果没有针对每种产品的单独表格,如何满足这些要求?

P粉658954914
P粉658954914

全部回复(2)
P粉514001887

您至少有以下五个选项来对您描述的类型层次结构进行建模:

  • 单表继承:一个表适用于所有产品类型,有足够的列存储所有类型的所有属性。这意味着很多列,其中大多数在任何给定行上都是 NULL。

  • 类表继承:一张产品表,存储所有产品共有的属性类型。然后每种产品类型一个表,存储特定于该产品类型的属性。

  • 具体表继承:没有通用产品属性的表。相反,每种产品类型一张表,存储常见产品属性和产品特定属性。

  • 序列化 LOB:一个产品表,存储所有产品类型通用的属性。一个额外的列以 XML、YAML、JSON 或某种其他格式存储半结构化数据的 BLOB。此 BLOB 允许您存储特定于每种产品类型的属性。您可以使用奇特的设计模式来描述这一点,例如 Facade 和 Memento。但无论如何,您都无法在 SQL 中轻松查询大量属性;您必须将整个 blob 提取回应用程序并在那里进行排序。

  • Entity-Attribute-Value:一张产品表,以及一张将属性旋转到行而不是列的表。就关系范式而言,EAV 并不是一个有效的设计,但仍然有很多人使用它。这就是另一个答案提到的“属性模式”。请参阅 StackOverflow 上使用 eav 标记 的其他问题,了解一些陷阱。

我在演示文稿可扩展数据建模中写了更多相关内容。


关于 EAV 的其他想法:虽然很多人似乎喜欢 EAV,但我不喜欢。这似乎是最灵活的解决方案,因此也是最好的解决方案。但是,请记住这句格言 TANSTAAFL。以下是 EAV 的一些缺点:

  • 无法强制指定列(相当于 NOT NULL)。
  • 无法使用 SQL 数据类型来验证条目。
  • 无法确保属性名称拼写一致。
  • 无法在任何给定属性的值上放置外键,例如查找表。
  • 在传统表格布局中获取结果既复杂又昂贵,因为要从多行获取属性,您需要对每个属性执行JOIN

EAV 的灵活性程度需要您在其他方面做出牺牲,这可能会使您的代码比以更传统的方式解决原始问题复杂(或更糟)。

并且在大多数情况下,没有必要具有这种程度的灵活性。在OP关于产品类型的问题中,为每个产品类型创建一个用于产品特定属性的表要简单得多,因此至少对于相同产品类型的条目强制执行一些一致的结构。

仅当必须允许每一行可能具有一组不同的属性时,我才会使用 EAV。当您的产品类型有限时,EAV 就显得有些过分了。类表继承将是我的第一选择。


2019 年更新:我越多地看到人们使用 JSON 作为“许多自定义属性”问题的解决方案,我就越不喜欢该解决方案。即使使用特殊的 JSON 函数,它也会使查询变得过于复杂> 支持他们。与存储在普通的行和列中相比,存储 JSON 文档需要更多的存储空间。

基本上,这些解决方案在关系数据库中都不是简单或有效的。拥有“可变属性”的整个想法从根本上与关系理论不一致。

归根结底,您必须选择一种对您的应用影响最小的解决方案。因此,在选择数据库设计之前,您需要知道如何查询数据。无法选择一种“最佳”解决方案,因为任何解决方案都可能最适合给定的应用程序。

最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!