我设计了一个实体关系图(ERD),目的是创建父实体(INSTITUTION
)的两个子实体(LOCATION
和SPACECRAFT
),这取决于布尔属性(IS_SPACECRAFT
)的值。在MongoDB中实现这一点,我希望在INSTITUTION
实体为false (0)时将IS_SPACECRAFT
实体链接到另一个独立实体,当IS_SPACECRAFT
为true (1)时,将SPACECRAFT
实体链接到另一个单独实体。
现在,我正在手动地在这个无关实体中创建两个属性(SPACECRAFT_ID
和INSTITUTION_ID
),并根据IS_SPACRECRAFT
的值粘贴该属性中的INSTITUTION
或SPACECRAFT
实体的对象ID。但这不可避免地导致其中一个属性为NULL,我认为这是糟糕的数据库设计,是我想要避免的。考虑到这一点,是否有一种方法可以根据MongoDB中的布尔值链接另一个实体(即作为外键)?
下面是我前面提到的ERD,所以层次很清楚。判别器(d)表示一个不相交(重叠)子类型,双线表示一个完全约束,因此父LOCATION
实体的所有成员都位于SPACECRAFT
或LOCATION
中,而不是两者都存在。
作为参考,不相交的子类型定义为:
不相交的子类型(也称为非重叠子类型)是包含父类型实体集的唯一子集的子类型;换句话说,超级类型的每个实体实例只能出现在其中一个子类型中。
https://www.google.com/books/edition/Database_系统_设计_实现_M/4JN4CgAAQBAJ
发布于 2022-08-15 20:25:26
父实体location
与institution
和spacecraft
实体具有一对一的关系.MongoDB允许存储非规范化形式的数据.例如,您可以将数据构造为具有同一文档中的位置、航天器/机构详细信息的单个集合文档。
{
_id: <ObjectId>,
location_details: <some location specific details>,
child_data: {
type: <string>, // valid values would be "spacecraft", "ïnstitution"
id: <number>, // spacecraft_id or institution_id, depending upon the type
data: {
// specific fields depending upon the type
}
}
}
这通常适用于您的用例。可以通过对集合应用约束(或验证)在数据库中强制执行此结构。可以使用location
特性创建模式验证集合。架构验证允许数据库服务器端验证插入和更新操作。可以应用的一个示例验证是,"child_data.type"
是一个enum
,其值仅为"spacecraft"
或"institution"
。此外,您还可以基于"child_data.type"
在其他字段上定义验证。请注意,架构验证是一个可选特性。
数据建模需要与用例、数据量、应用程序功能(如CRUD操作)、其他需求等相关的信息,并且有一些因素可以影响集合中文档的数据结构。
https://dba.stackexchange.com/questions/315595
复制相似问题