我们正在推进这样的模型:
Person (id, given_name, family_name, title, suffix, birth_date)
Address (id, culture_id, line1, line2, city, state, zipCode, province, postalCode)
AddressType (id, descriptiveName)
PersonAddress (person_id, address_id, addressType_id, activeDates)
大多数人可能认为这太过分了。然而,在我们开发的应用程序中,一个不可否认的共同主题是它们将拥有一些基本实体——人员、组织、地址、电话号码等——并且它们都希望以不同的方式组合它们。因此,我们正在预先构建一些泛化,我们 100% 确定我们有用例。
Address 表将遵循一个 table-per-hierarchy 继承方案,以根据文化区分地址;因此美国地址将包含州和邮政编码字段,但加拿大地址将包含省和邮政编码。
我们使用一个单独的连接表来“给”一个人一个地址。当我们的经验是这往往会使事情变得复杂时,这使我们的其他实体 - 个人和地址 - 与其他实体无关。它还使得将 Address 实体连接到许多其他类型的实体(人员、组织等)以及与链接关联的不同上下文信息(如我的示例中的 activeDates)变得更加简单。