gpt4 book ai didi

mysql - 良好的数据库设计,可变数量的属性

转载 作者:IT王子 更新时间:2023-10-28 23:44:12 24 4
gpt4 key购买 nike

我正在尝试创建一个包含设备列表的数据库。所有设备都会有某些共同的属性(例如制造商、型号#、序列号等),然后还有其他特定于某个设备的属性(例如,调制解调器将具有访问权限#,而太阳能电池板将具有输出能力)。我不确定如何用良好的数据库设计原则来表示这些不断变化的属性,我尝试过在网上搜索,但我不完全确定要搜索什么。

我提出了以下可能的解决方案以及我对它们的初步想法:

  1. 拥有一个包含所有可能属性的大表,并在不适用的地方放置 null。显然,这有一些缺陷。

  2. 每种设备类型都有一个单独的表格。这似乎使用起来可能是一场噩梦,如果我想打印所有设备的列表,我怎么知道要查找哪些表?

  3. 有一个包含通用属性的表,以及使用外键访问的每种设备类型的其他表,以存储额外的属性。我可能可以完成这项工作,但这会很麻烦,而且感觉不是一个很好的解决方案。

  4. 实体-属性-值类型模型。只是看起来不太适合我想做的事情。

我在数据库方面没有很多经验,所以我在这里边学习边学习,任何与此问题相关的链接或有关数据库设计的“必读”文章将不胜感激。谢谢!

编辑:首先,我发现我需要谷歌“继承映射”,这可能会帮助其他有类似问题的人。为了解决这个问题,我最终使用了#2 和#3 的混合体。它实际上非常简单,运行良好,并且解决了添加额外设备类型的问题,而没有 EAV 的复杂性。感谢所有的意见和建议!

最佳答案

选项 1、2 和 3 都有一个非常严重的缺陷:当有人想出一个新属性时,您必须修改基础表架构。在选项 1 的情况下,问题因引入新设备类型的可能性而变得复杂。您如何确定属性集始终是固定的?如果中断或告诉客户不,您不能拥有新属性,您会很高兴吗?

如果您很可能对公共(public)属性进行查询,您可以尝试混合使用 3 和 4,在属性类型而不是设备类型上添加破折号 2,后者看起来更易变。如果我理解正确的话,选项 4 是选项 1 的普通形式版本,它解决了其所有固有问题(稀疏性和脆弱性)。

INVENTORY( id*, model, manufacturer, serial )
ATTRIBUTE( id*, name, type, description )
INVENTORY_FACT_STRING( inv_id*, attr_id*, value )
INVENTORY_FACT_NUMBER( inv_id*, attr_id*, value )
INVENTORY_FACT_LIST_STRING( inv_id*, attr_id*, ordinal*, value )

等等

关于mysql - 良好的数据库设计,可变数量的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11589267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com