在关系数据库中存储具有用户定义组件的实体

Storing Entities with User-defined Components in Relational Database

我正在努力寻找存储具有用户定义字段的实体的最佳方式。我希望能够对这些字段进行查询,所以我觉得 NoSQL 可能不是最好的方法。持续的模式迁移似乎很痛苦,尤其是因为不同的用户可能需要相似实体上的不同字段。

例如,假设我们有一个代表村庄的实体。该村有名称(西镇)、类型(村)、人口(114)。用户可能希望将自己的属性添加到村庄,例如昵称。这不是预先知道的,其他村庄可能不需要。

我想出的最好的技术是 table 用于实体,然后单独的 table 用于 "components" 实体,包括:组件 ID 、它所在实体的外键、组件的名称及其值。

因此,示例中的村庄将存在为:

Table 1 - Entity
ID
1

Table 2 - String Components
ID ENTITY_ID NAME    VALUE
1  1         name    West Town
2  1         type    village

Table 3 - Integer Components
ID ENTITY_ID NAME       VALUE
1  1         population 114

然后,如果用户想要向村庄添加一个 "nickname",他们可以按下一个按钮,select 一个字符串组件,将其命名为 "nickname" 并为其赋值的 "Wesson":

Table 2 - String Components
ID ENTITY_ID NAME      VALUE
1  1         name      West Town
2  1         type      village
3  1         nickname  Wesson

然后,当实体需要显示时,我们在组件tables中查询实体ID,显示信息:

name:       West Town
population: 114
type:       village
nickname:   Wesson

这是疯了吗?感觉既像是一种在关系数据库中表示 mutable 模式的优雅方式,又像是试图绕过关系数据库的全部要点。有没有更好的方法?

回答我自己的问题。这似乎通常使用称为 "entity-attribute-value" 的模式来解决,这与我所建议的类似。

实体 table 可能更丰富一些,它还存储所有实体共有的信息,例如 "name" 和 "entity_type" table 中的外键。

最简单的是,属性 table 可以如上所示,每种数据类型各有一个。

https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model