我正在为朋友建模贷款数据库。
客户可以 0到N 地址(街道地址或POBox地址,甚至超过1个街道地址,而不是POBox地址)。 属性必须只有一个地址。 公司(就业信息)必须只有一个地址。
最好为客户表提供单独的地址表。 属性和公司的地址可以与属性和公司表一起使用。
但是,由于我们在此处有地址表,您认为分享公司的地址表是一个好主意吗?还有属性表?
当我们考虑实体之间的关系时,我们应该切断时间点(静态方式?)或者我们应该查看某个时间范围(动态方式?)分析他们的关系?例如,公司在某个时间点只能有一个地址,但该公司最近可能会从一个地方搬到另一个地方。然后,公司可能在一段时间内拥有多个地址。
答案 0 :(得分:3)
客户会比1到N更好,而不是0到N的关系,因为您正在发放贷款,您可能想知道他们的地址。
公司(就业信息)必须只有一个地址。
然后,公司可能会在一定范围内拥有多个地址 时间。
你有点自相矛盾,为什么你需要这两个地址?我认为公司将只有一个地址,直到他们获得新地址的所有内容,此时您可以将数据库更新为新地址。
但是既然我们在这里有一个地址表,你认为它是好的吗? 想法或不共享公司和属性的地址表 桌子也是?
是
这里有关于建模的一些想法很好的链接:
答案 1 :(得分:2)
公司(就业信息)必须只有一个地址。
不一定。公司可以拥有邮寄地址和实际地址。
由于我们在此处有一个地址表,您认为是否也可以共享公司和属性表的地址表?
是的,将地址放在地址表中是个好主意。您的Properties表将具有地址行外键,您的Companies表将具有2个外键,一个用于邮寄地址,一个用于物理地址。邮寄地址是可选的(可为空的)外键。
您需要一个CuustomerAddress表来维护Customer和Address之间的0到N关系。如果需要,您还可以在地址和客户之间建立0到N的关系。
表格看起来像这样。
CustomerAddress
---------------
CustomerAddress ID
Customer ID
Address ID
CustomerAddress ID是主要(群集)索引。它是一个升序整数或长整数,或其他一些唯一ID。
您将拥有唯一的索引(客户ID,地址ID)。
如果您想将地址与客户关联,您将拥有另一个唯一索引(地址ID,客户ID)。
公司在某个时间点只能有一个地址,但该公司最近可能会从一个地方搬到另一个地方。然后,公司可能在一段时间内拥有多个地址。
如果此信息很重要,则必须在CompanyAddress表中包含日期写入列。您将在(公司ID,写日期降序)上创建唯一索引。这样,从Address表中检索的第一行将是最新的地址。
答案 2 :(得分:1)
将所有地址放在自己的表中似乎是一个非常受欢迎的想法。开发人员喜欢寻找重复并消除它。但是在这种情况下,我会毫不犹豫地通过将地址置于他们自己的专用表中来使地址具有实体状态,因为如果像大多数应用程序一样,你不会将地址视为完整的实体,那么这就会变得过于复杂。
如果您将地址视为真实实体,那么如果两家公司以某种方式共享同一地址,或者一个地方居住了一段时间,那么另一家居住在同一地点,那么这些公司将引用相同的地址。因为当你的应用程序接受一个地址作为输入时,它会查看是否有一个现有的地址并引用它而不是只是将一些垃圾砸到地址表中。你打算做哪一个?我希望它是满贯的,这很好,因为像大多数业务应用程序一样,你完全不在乎你输入的新地址是否与数据库中已有的其他地址相同,你没有兴趣跟踪作为个别事物处理。这就是实体和猫粮之间的区别。
因此,通过合并,我们必须引入一个交集表并对其进行索引,并且所有具有地址的实体都必须加入它,我们必须考虑是否急切地获取地址或使用延迟加载。我们将所有地址放入一个桶中,并且必须努力确保每个人都能快速到达他们自己的地址。对于真实的实体,这是有道理的,因为不同的东西需要链接到同一个实体,但我们在上面建立了我们不关心的,没有人分享这些条目。
通过将地址合并到一个表中,我们正在消除重复的位置?地址将最终在数据库的某个地方结束,无论使用相同的字段,我们都不会节省空间。唯一的重复是在用于生成模式的DDL中,我们可以通过为地址创建一个可重用的组件(其中“组件”是Hibernate术语)来管理该地址(它解决了应用程序代码中的冗余)并使用ORM工具生成架构。或者,最坏的情况是,忽略它,地址不会改变那么多,这不是你最大的问题。
对于您正在为朋友做的项目,您描述的这些要求听起来很可疑。可能你的朋友的大脑因过度暴露于由不知道他们在做什么的委员会炮制的精心要求而中毒。我们不得不在工作中忍受这个垃圾,但个人项目呢?试着跟他说话。
但也许你的朋友正在将他的企业工作外包给你,而你却被每个客户的0-N地址所困扰。如果是这样,包含损坏:专门为客户地址创建一个表,因此您不需要交集表,并将其他实体的地址内联。使这些只有一个地址的实体从另一个表中获取地址不会给你带来任何东西,只会有更多的联接。如果您需要历史记录,请将其写入单独的历史记录表中,并将其排除在外。