首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MongoDB中实现完全完备的不相交(不重叠)亚型?

如何在MongoDB中实现完全完备的不相交(不重叠)亚型?
EN

Database Administration用户
提问于 2022-08-14 01:14:22
回答 1查看 240关注 0票数 1

我设计了一个实体关系图(ERD),目的是创建父实体(INSTITUTION )的两个子实体(LOCATIONSPACECRAFT),这取决于布尔属性(IS_SPACECRAFT)的值。在MongoDB中实现这一点,我希望在INSTITUTION实体为false (0)时将IS_SPACECRAFT实体链接到另一个独立实体,当IS_SPACECRAFT为true (1)时,将SPACECRAFT实体链接到另一个单独实体。

现在,我正在手动地在这个无关实体中创建两个属性(SPACECRAFT_IDINSTITUTION_ID),并根据IS_SPACRECRAFT的值粘贴该属性中的INSTITUTIONSPACECRAFT实体的对象ID。但这不可避免地导致其中一个属性为NULL,我认为这是糟糕的数据库设计,是我想要避免的。考虑到这一点,是否有一种方法可以根据MongoDB中的布尔值链接另一个实体(即作为外键)?

下面是我前面提到的ERD,所以层次很清楚。判别器(d)表示一个不相交(重叠)子类型,双线表示一个完全约束,因此父LOCATION实体的所有成员都位于SPACECRAFTLOCATION中,而不是两者都存在。

作为参考,不相交的子类型定义为:

不相交的子类型(也称为非重叠子类型)是包含父类型实体集的唯一子集的子类型;换句话说,超级类型的每个实体实例只能出现在其中一个子类型中。

https://www.google.com/books/edition/Database_系统_设计_实现_M/4JN4CgAAQBAJ

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-08-16 04:25:26

父实体locationinstitutionspacecraft实体具有一对一的关系.MongoDB允许存储非规范化形式的数据.例如,您可以将数据构造为具有同一文档中的位置、航天器/机构详细信息的单个集合文档。

location

代码语言:javascript
运行
复制
{
    _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操作)、其他需求等相关的信息,并且有一些因素可以影响集合中文档的数据结构。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/315595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档