1

我正在为朋友建模一个贷款数据库。

一个客户可以有0 到 N个 地址(街道地址或 POBox 地址,甚至超过 1 个街道地址,比 POBox 地址更多)。一个Property必须只有一个Address。一家公司(就业信息)必须只有一个地址

最好为客户表提供一个单独的地址表。财产公司的地址可以与财产公司表一起使用。

但是由于我们在这里有一个地址表,您认为是否也共享公司属性表的地址表是一个好主意?

当我们考虑实体之间的关系时,我们应该切断一个时间点(静态方式?)还是我们应该查看一定范围的时间(动态方式?)来分析它们的关系?例如,一家公司在某个时间点只能有一个地址,但该公司最近可能从一个地方搬到另一个地方。那么一家公司可能在一定的时间范围内拥有多个地址。

4

3 回答 3

3

客户使用 1 到 N 比 0 到 N 关系更好,因为您正在贷款,您可能想知道他们的地址在哪里。

公司(就业信息)必须只有一个地址。

那么一家公司可能在一定的时间范围内拥有多个地址。

你有点自相矛盾,你为什么需要这两个地址?我认为公司将只有一个官方地址,直到他们在新地址上获得所有内容,此时您可以将数据库更新到新地址。

但是由于我们在这里有一个地址表,您认为是否也共享公司和属性表的地址表是一个好主意?

是的

这里有一个很好的链接,其中包含一些关于建模的想法:

http://www.databaseanswers.org/data_models/

于 2013-03-21T14:50:05.833 回答
2

公司(就业信息)必须只有一个地址。

不必要。公司可以有一个邮寄地址和一个实际地址。

由于我们在这里有一个地址表,您认为是否也为公司和属性表共享该地址表是个好主意?

是的,将地址放在地址表中是个好主意。您的 Properties 表将有一个地址行外键,而您的 Companies 表将有 2 个外键,一个用于邮寄地址,一个用于实际地址。邮寄地址将是一个可选的(可为空的)外键。

您需要一个客户地址表来维护客户和地址之间的 0 到 N 关系。如果需要,您还可以在 Address 和 Customer 之间建立 0 到 N 的关系。

桌子看起来像这样。

CustomerAddress
---------------
CustomerAddress ID
Customer ID
Address ID

CustomerAddress ID 是主(集群)索引。它是一个升序整数或长整数,或其他一些唯一 ID。

您将拥有一个唯一的索引(客户 ID、地址 ID)。

如果您想将地址与客户相关联,您将在 (Address ID, Customer ID) 上有另一个唯一索引。

一家公司在某个时间点只能有一个地址,但该公司最近可能从一个地方搬到另一个地方。那么一家公司可能在一定的时间范围内拥有多个地址。

如果此信息很重要,那么您必须在 CompanyAddress 表中包含一个日期写入列。您将在(公司 ID,日期写入降序)上创建唯一索引。这样,您从地址表中检索的第一行将是最新的地址。

于 2013-03-21T14:56:38.577 回答
1

将所有地址放在自己的表中似乎是一个非常流行的想法。开发人员喜欢寻找重复并消除它。但是在这种情况下,我会犹豫通过将它们放在自己的专用表中来使具有实体状态的地址高贵,因为如果像大多数应用程序一样,您不将地址视为成熟的实体,这会变得过于复杂。

如果您将地址视为真实实体,那么如果两家公司以某种方式共享相同的地址,或者一家公司在某个地点居住了一段时间,然后另一家公司在同一地点居住,那么这些公司将引用相同的地址。因为当您的应用程序接受地址作为输入时,它会查看是否存在现有地址并引用它,而不是仅仅将一些垃圾放入地址表中。你打算做哪一个?我希望这是大满贯,这很好,因为像大多数业务应用程序一样,您完全不在乎您输入的新地址是否与数据库中已有的其他地址相同,您没有兴趣跟踪地址作为个别事物。这就是实体和猫粮的区别。

所以在合并的过程中,我们必须引入一个交集表,并对其进行索引,并且我们所有有地址的实体都必须加入它,我们必须考虑是急切地获取地址还是使用延迟加载。我们将所有地址都放入一个存储桶中,并且必须努力确保每个人都能快速找到自己的地址。对于真实的实体,这是有道理的,因为不同的事物需要链接到同一个实体,但我们在上面确定了我们并不关心这一点,没有人共享这些条目。

我们通过将地址合并到一张表中消除了哪些重复?无论使用相同的字段,地址都将最终存储在数据库中,我们不会节省空间。唯一的重复是在用于生成模式的 DDL 中,我们可以通过为地址(解决应用程序代码中的冗余)创建一个可重用组件(其中“组件”是 Hibernate 术语)并使用 ORM 工具来管理它生成架构。或者,最坏的情况,忽略它,地址不会发生太大变化,这不是你最大的问题。

对于您为朋友做的项目,您描述的这些要求听起来很可疑。可能你朋友的大脑因过度暴露于不知道自己在做什么的委员会炮制的复杂要求而中毒。我们不得不在工作中忍受这些垃圾已经够糟糕了,但是对于个人项目呢?试着说服他。

但也许你的朋友正在将他的企业工作外包给你,而你却被每个客户的 0-N 个地址困住了。如果是这样,则包含损坏:专门为客户地址制作一个表,因此您不需要交集表,并将其他实体的地址内联。让这些只有一个地址的实体去从另一个表中获取他们的地址不会给你带来任何东西,而是更多的连接。如果您需要历史记录,请将其写入单独的历史记录表中。

于 2013-03-21T16:53:09.897 回答