复合FK表的多对多关系数据库

问题描述 投票:1回答:1

我正在构建一个api,但我对db设计太害怕了。我正在尝试练习一本地址簿,员工可以在那里找到他们的地址(家庭,工作,其他)。那么多对多的关系呢?

我的数据库设计是否正确?创建复合表以获得灵活性

enter image description here

enter image description here

ON DELETE和ON UPDATE在这里很重要吗?如何设置它以便删除员工,我们不想在其他2个表中保留其他记录?

php mysql sql database-design data-modeling
1个回答
1
投票

首先,我觉得有必要补充一点,SO并不是真正适合这个的地方,我不确定但如果有一个仅适用于数据库的网站/电路板,我不会感到惊讶。很多这样的东西都是个人偏好和意见。

可能这样的事情会是一个更合适的地方:

https://dba.stackexchange.com/

那说:

  • 我会把PK改为表中的id,所以address_type.id它只是id而且对于人来说是一样的。做person.person_id只是多余
  • id应该是INT(10) unsigned AUTO INCREMENT 10是10个地方,或者约99,999,999,999。您不能拥有负面ID,因此数据库应该强制执行此操作。我做10因为,它是INT(11),并保持标志位保留。这不是必要的,但我是出于任何unsigned int的习惯而做的。
  • 我会复数桥牌表persons_addresses。因为,personaddress中的记录是针对一个实体的。桥表中的记录适用于多个实体。对我而言,它更容易分辨它是一个桥牌表。例如,所有其他都是单数,这些是复数。

“命名约定”的主要内容是保持一致。如果你为你的身份证做{table}_id,那么就这样做。如果你做person不做像zipcodes的桌子。甚至列名如果你做person_id然后不做任何列如FullNamefullNameFull_name等我会说选择一种方式并坚持它,它使你更容易编写代码,如果你提前知道表名字将是单数。正如我所说,我喜欢桥牌桌的复数用途,因为你很少自己使用它们。

对于这段关系。你仍然需要分别删除personaddress。但是,如果您将它们更改为级联,则会更新或删除persons_addresses中的记录。我这样想:定义关系的表是接收更改的表。

这是应该的方式。想象一下,你有2个人的记录具有相同的地址。如果删除一个人,则不希望从这两个人中删除该地址。此外,如果他们的地址被删除,您可能不希望删除某个人。所以最多它应该是:

person > persons_addresses > address

当桥表中没有记录时,我不确定是否有自动删除地址的方法。我总是手动完成它,但如果没有更好的方法,你可以使用trigger来做。

以供参考:

触发器是与表关联的命名数据库对象,并在表发生特定事件时激活。 https://dev.mysql.com/doc/refman/5.7/en/triggers.html

说实话,我从来没有为此做过,我认为触发器可能不会触发级联操作,我记得有些事情只是被解雇了SQL语句。在这种情况下,最好只使用触发器从person进行删除。所以你会删除一个人,触发器会触发,你会检查是否有其他人使用该地址,如果false你删除了persons_addresses记录和address记录。如果true你只会删除persons_addresses记录。


我要做的另一件事是,打破地址以便有一个单独的zipcode。在我的工作中,我们购买了一个包含所有美国邮政编码的数据库表,其中包含所有城市,州,县,邮政编码(当然)以及纬度和经度。

通过使用我们的地址表包含与zipcodes的多对一关系。一个邮政编码可以有许多与之关联的地址。我们还使用状态表通过状态将其打破。所以它变成了

address
 id | street | street2 | zipcode_id

zipcode
id | city | state_id | county | zip | latitude | longitude

state
 id | name | abbreviation 

然后,当用户输入邮政编码时,它会显示自动填写的所有信息。

然后我们做的最后一件事是将所有STNNW等标准化。我们选择将它们更改为全名,以便ST在保存时变为STREET。我们去那边是因为你可能有像187 NORTH PARK这样的街道地址,看起来像187 N PARK,这比187 PARK NE变得更加187 PARK NORTH EAST更糟糕。你会惊讶于地址的变化,我称之为“污垢”或“肮脏”。

所有这些结合起来,消除了很多错误。但正如我在评论中所说,我们处理诉讼数据,所以我们必须有更多的准确性,因此更复杂,然后只是一本地址簿。

© www.soinside.com 2019 - 2024. All rights reserved.