【问题标题】:What is the normalized database form for these 3 tables?这 3 个表的规范化数据库形式是什么?
【发布时间】:2012-09-04 03:43:12
【问题描述】:

所以我有三个表和三个模型:

Company (table: companies)
Person (table: people)
Address (table: addresses)

如何将这些连接在一起,考虑到每个人或公司可以有多个地址,但由于地址格式相同,我想使用一个“地址”表,因此可以完成交易/管理地址通过单一模型?

因为这个结构:

companies(id, name, ...)
people(id,name, ... )
addresses(id, foreign_id, foreign_model, ...)

对我来说似乎有点不合适。基本上这是现在的结构。 “foreign_model”字段是一个字符串,它指定地址属于哪个模型(即公司或个人)。

这一切都在Cakephp下,但是我这个结构有很多问题,我应该用什么来代替?

【问题讨论】:

  • 我认为你需要更多的表,因为你有“许多”关系。您可以有一个 CompanyAdresses 表,其中包含 Company 和 Address 的键,PersonAdresses 也是如此。
  • 感谢 Mikael,这确实是我首先想到的,但我真的试图避免它。我的意思是我们可以添加具有地址的新实体,然后每次都需要添加一个连接表?
  • np,是的,每个公司地址组合都会有一行。
  • 您打算将其他东西与公司或个人联系起来吗?例如将商品卖给公司或个人?

标签: sql database-design normalization


【解决方案1】:

这是怎么回事:

companies(id, name, address_id,..)
people   (id,name, address_id,... )
addresses(id,... )

公司和个人都指向地址表以获取他们的地址。 在这里您不必存储任何重复的地址(如果有)

编辑:如果公司和个人都可以有很多地址

然后保留一个映射表

companies(id, name,..)
people   (id,name, ... )
addresses(id,... )

Address_map(id,address_id,type)

类型表示是公司还是人员
id --> companyid 或 poepleid

【讨论】:

  • 嗨,Joe,谢谢,但公司和个人都可以有很多地址(就像公司有很多您将产品运送到的地址等),所以基本上这是一个一对多的连接。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2011-03-19
  • 2017-04-03
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多