mysql - 仅用于配置数据的名称-值-对模型
问题描述
我读到数据库设计中的名称-值-对模型是一种反模式。本质上,您有一个包含两列的表。一列称为“名称”,另一列称为“值”。假设您正在管理不同区域的 AWS 配置。数据库结构如下:
name value
aws.new_york.access_key jio4j54h
aws.new_york.site.user john
aws.new_york.site.pass eoiri4iiuh
aws.los_angeles.access_key tret55464
aws.los_angeles.site.user bob
aws.los_angeles.site.pass rtry45yrt
aws.new_york.access_key fgfhgf4fdg
aws.new_york.site.user edward
aws.new_york.site.pass 45gfhgfhgf
唯一的用途是检索配置:
MyApp.config.get('aws.new_york.access_key')
另一种解决方案是使用连接。这将消除重复并允许参照完整性。但它变得很麻烦:
table_aws has_many table_states which has_many table_credentials 具有列 access_key、user、pass。这确实消除了重复,但想象一下嵌套连接数量增加的潜力。
鉴于我唯一的用例,名称-值-对模型模型仍然是反模式还是合适?
解决方案
您正在考虑的反模式可能是实体-属性-值。您正在描述一个简单的“哈希表”。如果这个表只有一百行,甚至一千行,也没有问题。
但是...您实际上是在描述 EAV,只是您使它变得更加混乱。
aws.new_york.access_key
实际上是aws.new_york
作为“实体”和“access_key”作为“属性”。
通常 EAV 表应该是 3 列,PRIMARY KEY(entity, attribute)
按该顺序排列。
如果您的目标只是“配置”的存储库,那么您不太可能执行到达 EAV 崩溃的查询。
所以......让我们看看在通过判断之前您将如何处理数据集。
推荐阅读
- itext - 使用 iText 5.5 使用 PdfAnnotation 旋转 PDF 签名外观(文本和背景图像)
- java - 如何将一个项目嵌入到另一个项目中?
- javascript - 为什么在第一个元素之后有额外的空间
- ios - 如何从下到上呈现部分高度模态视图控制器
- php - WordPress的迁移问题
- javascript - how to change VUE main.js to use routers/index.js
- php - How to set Laravel Model table/collection dynamically?
- laravel - 在 null laravel 上调用成员函数 addDays()
- java - How to signal incoming call to Bluetooth correctly?
- apache - AH00534:apache2:配置错误:未加载 MPM