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

Database 在关系数据库中存储具有用户定义组件的实体,database,relational-database,structure,Database,Relational Database,Structure,我正在努力找到用用户定义的字段存储实体的最佳方法。我希望能够查询这些字段,所以我觉得NoSQL可能不是最好的方法。持续的模式迁移似乎很痛苦,特别是因为不同的用户可能需要相似实体上的不同字段 例如,假设我们有一个实体代表一个村庄。该村庄有一个名字(西城)、一个类型(村庄)、一个人口(114)。用户可能希望向村庄添加自己的属性,例如昵称。这是事先未知的,其他村庄可能不需要这样做 我想到的最好的技术是为实体创建一个表,然后为实体的“组件”创建一个单独的表,包括:组件id、它所在实体的外键、组件名称及其

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

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

我想到的最好的技术是为实体创建一个表,然后为实体的“组件”创建一个单独的表,包括:组件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
然后,如果用户想要向村庄添加“昵称”,他们可以按下按钮,选择字符串组件,称之为“昵称”,并给它一个值“Wesson”:

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

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

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

回答我自己的问题。这似乎通常是使用一种称为“实体属性值”的模式来解决的,这种模式类似于我所建议的

entities表可以更丰富一些,还可以存储所有实体的公共信息,比如“name”和一个外键到“entity_type”表中

最简单的情况是,属性表可以如上所述,每个数据类型对应一个属性表


我见过这样的设置,用于特殊的额外属性。考虑如何呈现查询结果“所有IDS的组件和它们的值”,其中不同的ID具有不同的组件集。此外,您可能还有其他类型的组件:日期(表3)、布尔值(表4)等等。。。
name:       West Town
population: 114
type:       village
nickname:   Wesson