【问题标题】:Design Pattern required for database schema with two classes both composing a third class具有两个类都构成第三类的数据库模式所需的设计模式
【发布时间】:2010-10-12 18:24:05
【问题描述】:

考虑一个既有字母又有人的系统;这两个类组成一个地址。在为系统设计数据库时,为地址设置单独的模式似乎是明智的,但这会导致问题;我不知道如何让地址表中的外键清楚地识别它属于什么,因为外键可以识别一个字母或一个人。此外,我希望还会添加更多的类,这些类也将构成一个地址。

如果设计模式能够解决此类设计问题,我将不胜感激。

最好的问候

【问题讨论】:

  • 我有点困惑为什么我们要讨论类,这是一个面向对象的概念,适用于关系数据库的 SQL。这是对象关系映射器解决的断开连接。
  • 对类的讨论仅用于说明我正在尝试为其创建适当数据库模式的系统各部分之间的关​​系。

标签: sql design-patterns database-design


【解决方案1】:

我不知道如何拥有外键 在地址表中清晰地识别 它属于什么,因为外国 key 可以识别一个字母或 一个人。

听起来你搞错了。地址表中不会有外键;相反, letters 表将有一个引用地址表的外键,而 person 表也将有一个引用地址表的外键。

在 SQL 中,信息架构目录中的 REFERENTIAL_CONSTRAINTS 视图将告诉您哪些表正在引用地址表。

在我们的商店中,我们经常讨论是否应将地址本身建模为实体。将地址视为一个实体的问题在于,除了属性本身(邮政编码、房屋名称或号码等)之外,没有可靠的密钥,并且许多变体可以识别相同的地址(我可以用 20 种不同的方式写我的家庭住址) .然后你需要考虑邮政信箱、地址管理、圣诞老人等等。还有一个大问题:你允许修改地址吗?如果有人搬家,他们是否保留具有修改属性的相同地址实体(这样所有链接的实体都会更改地址)还是锁定地址的属性并强制创建新的地址实体然后重新链接所有引用地址到新的(您是否删除了现在孤立的地址实体,如果是,那么您为什么要费心替换它...?)但是您的应用程序仍然需要允许修改地址,以防邮局更改它在现实生活中,但如何防止这种能力被滥用,即用于上述非法搬家?您可以使用网络服务来清理您的地址数据,这样是正确的,但是外部系统方式的干净数据较少,因此您无法再匹配您的地址实体...?

我想保持简单:地址是一个单一的属性,它是您必须放在邮件上的明文,以便邮局将其交付给相关的可寻址实体;它本身不是一个实体,因为它缺少标识符。出于实际原因(例如,能够将其打印在地址标签上),这个单一属性通常被拆分为亚原子元素(address_line_1、address_line_2、... postal_code 等等)。

因为大多数 SQL 产品都缺乏对域的支持,所以我可以在为可寻址实体建模的每个表之间复制列名、数据类型、约束等。

【讨论】:

    【解决方案2】:

    外键肯定应该来自引用地址表主键的 Letter 和 People 表吗?

    因此,Letter 表包含一个 AddressId 列,该列引用 Address 表上的 Id,Person 表也是如此,以及构成地址的任何未来类。

    如果 Letters 和 Persons 组成多个地址,则需要中间链接表。

    【讨论】:

    • 我同意这似乎是最明显的方法;确实是我目前实施的。我担心的是我创建了一个大型地址表,这些地址本身并不能识别它们属于什么。如果这是具有众所周知的解决方案的常见场景,那么我会考虑重构我的模式;否则我会保持原样并接受断开连接。
    • @Howard 很大程度上取决于信件、人物和关系的具体细节。我用过的大多数系统都有一个客户和地址之间的映射表,因为客户可以有多个地址(家庭、工作、代表他们行事的律师等),但信件可能需要完全照原样复制打印,因此您不希望在重新打印旧信件时反映地址的更新。在这种情况下,我看到地址只是以文本形式存储在字母表中,比如说。您可能需要更多地考虑决定您的设计需要什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多