MySQL关系问题

时间:2014-11-21 12:41:55

标签: mysql sql database foreign-keys

我下面有两个表结构

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)

的person_address链接的链接

任何想法

3 个答案:

答案 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)