我下面有两个表结构
person (id, fname, lname, ph, mob, dob, email)
address (id, address1, address2, address3, town, county, postcode)
person_address (id, person_id, address_id)
我在这里有一个问题,如果一个人有多个地址我将如何计算出哪个是活动的或当前地址,我应该添加地址表的直接链接,例如person (id, fname, lname, ph, mob, dob, email, address_id)
或者我应该添加指向人员表person (id, fname, lname, ph, mob, dob, email, person_address_id)
任何想法
答案 0 :(得分:2)
据推测,一个人只能拥有一个当前地址。如果是这样,您应该在person
表中添加一个列,称为CurrentAddress
。
如果您要求当前地址,您甚至可以将CurrentAddress
声明为NOT NULL
。
如果一个人可以拥有多个当前地址,请使用person_address
中的标记。
现在,如果您希望当前地址是最近插入的地址,则可以使用触发器重置每个插入的值。或者,如果您的数据库不是太大(数千行,而不是数百万行),您可以通过选择具有最近创建时间的person_address
记录来动态计算它。
编辑:
@Joanvo的观点是一个好点。您可以通过在引用person
的{{1}}中添加外键约束来解决此问题。您必须在person_address
上创建一个唯一约束,并将其用于外键。
答案 1 :(得分:2)
您应该在person_address表中添加一个位,以指示它是否是当前地址。通过sql或代码检查确保不超过一个当前地址:
person_address (id, person_id, address_id, current)
答案 2 :(得分:1)
如果您将 person_address 表的引用添加到 person 表中,该表将在 person_address 和之间创建循环依赖关系person 表,因为 person_address 表已经封装了对 person 表的引用。在处理数据库设计时你不应该做的事情。 现在,如果您想要一个干净的设计,我建议您从地址表中引用人员表,就像您在第一个示例中所做的那样。所以你的设计解决方案如下:
person (id, fname, lname, ph, mob, dob, email, address_id)
修改强>
或者解决方案是 person_adress 表中的 current_flag ,因此当您想拥有某个人的当前地址时,您将搜索 person_adress 条目, current_flag 为该人设置为1。
person_address (id, person_id, address_id, current_flag)