实体-属性-值模式是对此数据进行建模的正确方法吗?

Is Entity-Attribute-Value pattern the right approach to model this data?

提问人:Alex0xff 提问时间:11/6/2023 更新时间:11/14/2023 访问量:52

问:

为了控制实验设置,用户输入下表,该表定义了唯一的参数配置,即运行实验的参数值组合。参数的数量及其含义可以是任意的,例如,在这里,我们有 和 。ModeAmpGainInputVoltage

配置名称 模式 安培增益 输入电压
MX1_LG_HV MX1系列 1 3.3
MX1_HG_HV MX1系列 10 3.3
MX2_LG_HV KXt公司 1 3.3
MX2_HG_HV KXt公司 10 3.3
MX2_LG_LV KXt公司 1 1.8
MX2_HG_LV KXt公司 10 1.8

在我的应用程序中,这些数据需要保存在类似 SQL 的数据库(例如 SqLite)中。 从关于数据库设计模式的各种文章中,我发现实体-属性-值模式是表示此模型的一种可能方法,即:

Parameter表来描述参数

参数 ID (PK) 参数名称
1 模式
2 安培增益
3 输入电压

Config描述配置的表

配置 ID (PK) 配置名称
1 MX1_LG_HV
2 MX1_HG_HV
3 MX2_LG_HV
4 MX2_HG_HV
5 MX2_LG_LV
6 MX2_HG_LV

最后,将表组合在一起,其中 和 形成一个主键:ConfigIDParamID

配置标识 参数 ID 值Int 值浮动 值斯特
1 1 MX1系列
1 2 1
1 3 3.3
2 1 MX1系列
2 2 10
2 3 3.3
3 1 KXt公司
3 2 1
3 3 3.3
4 1 KXt公司
4 2 10
4 3 3.3
5 1 KXt公司
5 2 1
5 3 1.8
6 1 KXt公司
6 2 10
6 3 1.8

这是实现 EAV 模式的正确方法吗? 考虑到参数不会超过 25-30 个,并且这些数据每分钟只需要访问/保存一次,有没有更好的方法来对数据进行建模?

sql sqlite 实体属性值 数据模型

评论

1赞 Panagiotis Kanavos 11/6/2023
EAV 无论如何都是一种反模式,即坏主意。您将失去类型安全性,无法检查、索引甚至查询值。要检索单个事物,您必须在客户端上执行 N 向自连接或重新构建行。如果要存储一堆不需要查询的内容,请将其存储为 JSON 或 XML 文本。SQLite具有JSON函数,可用于从JSON字段中提取信息。
1赞 Panagiotis Kanavos 11/6/2023
如果决定需要查询某些 JSON 字段,可以使用 JSON 函数创建计算列。您也可以将这些列包含在索引中,从而加快查询速度
0赞 Alex0xff 11/7/2023
@PanagiotisKanavos感谢您指出SQLite对JSON的支持!不幸的是,我的应用程序需要查询这些属性。
1赞 marcothesane 11/7/2023
我不明白为什么如果你希望数据库确保组合的唯一性,为什么不最好创建一个包含所有参数的 20 到 30 列表,可为 null,并排,甚至在所有 20 到 30 列上添加唯一索引。你帮助RDBMS做它擅长的事情:在原子级别强制执行正确的数据类型,在行级别强制执行唯一性。我不会增加任何复杂性,除非能够详细描述我期望从中获得的优势。就我而言,形式服从功能,而简单就是这样。
0赞 Alex0xff 11/7/2023
@marcothesane您的意思是直接在参数之后命名列,因为它显示在我帖子的第一个(输入)表中?我认为这是一种不好的做法。此外,参数名称可能包含空格。

答:

0赞 Alex0xff 11/14/2023 #1

我最终决定将这些参数序列化到 JSON 字段中,正如 @Panagiotis Kanavos 所建议的那样。这比实现EAV模式要麻烦得多,而且,许多ORM框架都支持访问JSON字段。