如何在TypeDB中定义Address属性?建模Person与Address关联
问题背景
我刚接触TypeDB,有个Schema建模的基础问题:怎么建模Person拥有Address?这里的Address是由以下三个值组成的复合属性:
- city(城市)
- street(街道)
- ZIP code(邮编)
我的理解是:TypeDB里一个属性只能有一个值定义,但可以拥有任意数量的其他属性。我自己尝试了三种建模方式,想问哪种(如果有的话)是推荐做法?
我的基础属性定义:
street sub attribute, value string; city sub attribute, value string; zip sub attribute, value long;
(1) 无值属性?
address sub attribute, // value ... (这里好像说不通) ??? owns street, owns city, owns zip; person sub entity, owns address;
(2) 建模为关系?
address sub relation, relates street, relates city, relates zip, relates subject; // ??? person sub entity, plays address:subject;
(3) 建模为实体?
address sub entity, owns street, owns city, owns zip; person sub entity, owns address; // ??? 实体可以拥有另一个实体吗?
推荐方案:将Address建模为实体(你的第三种方式)
先明确TypeDB的核心概念规则,再逐个分析方案:
- 实体(Entity):代表现实世界中的独立对象,能拥有属性、参与关系,是承载复合属性集合的合适容器。
- 属性(Attribute):必须有且仅有一个
value类型定义,无值属性在TypeDB里不被允许,直接排除第一种方案。 - 关系(Relation):用于连接多个角色参与者,本质是描述对象间的关联,而非承载复合属性的容器,第二种方案语义完全错误。
针对你第三种方式的疑问“实体可以拥有另一个实体吗?”,分两种场景优化:
场景1:Address完全依附于Person(无共享,比如一对一/一对多)
如果Address不会被多个Person共用(比如每个人的地址都是独立的),可以直接用owns语法表达从属关系:
street sub attribute, value string; city sub attribute, value string; zip sub attribute, value long; address sub entity, owns street, owns city, owns zip; person sub entity, owns address;
场景2:Address可被多个Person共享(多对多,比如一家人同住)
如果存在多个Person共用同一个Address的情况,用关系来关联两者更符合语义:
street sub attribute, value string; city sub attribute, value string; zip sub attribute, value long; address sub entity, owns street, owns city, owns zip; lives-at sub relation, relates resident, relates address; person sub entity, plays lives-at:resident;
其他方案为什么不可行?
- 无值属性方式:TypeDB强制要求每个属性必须声明
value类型,无值属性的Schema定义会直接报错,完全不可行。 - 关系方式:关系的核心是描述对象间的关联,而Address本身是一个带属性的独立对象,不是“Person和street/city/zip的关联”,这种建模会导致后续查询、数据插入逻辑混乱,语义完全错误。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

