【问题标题】:People has 3 Addresses and Address belongs to People, what's the best practice?人们有3个地址,地址属于人,最佳做法是什么?
【发布时间】:2013-12-24 13:40:50
【问题描述】:

在带有 cakephp 2.4.3 的 mysql 数据库中。 人们总是有 3 个地址。

  1. 注册地址。
  2. 他们现在住的地方。
  3. 他们工作的地方。

两张表就像人的时间线。(意味着记录增加超时) 例如,如果您在现实生活中更改姓名。您将不得不在人员表中添加新记录。 1人这样的东西。

Year   name           address          address2      address3
2013 Parker boon   13/3 huston,usa  null         332/2 tansania
2014 Parker samel  13/3 huston,usa  23,NY,usa    332/2 tansania
2015 Parker samel  13/3 huston,usa  23,NY,usa    992 osky,russia 

2013 年,parker boon 住在他注册的地址。 2014 年,他搬到了 23,NY,usa。 2015年在俄罗斯工作。

我有 2 个问题。

首先,我在 People 表中创建了 3 个外键(address_id,address2_id,address3_id) 并专门为 1 个人提供 3 个地址 ID。 在人员表中。 people_id(PK), 姓名 , address_id(FK), 地址2_id(FK), address3_id(FK)

在地址表中。 address_id(PK) , 地址名称

是否比在地址表 (people_id) 中制作 1 个外键更好? 在人员表中。 people_id(PK) , 名字

在地址表中。 address_id(PK) , 地址名称, people_id(FK) , 地址类型, (注册、生活、工作)

其次,无论我的方法是否糟糕。我想知道如何配置模型和 saveAssociated() 或在 cakephp 中保存交易以供学习。

link to cake saveassociated

【问题讨论】:

  • 他们有两份工作是什么?如果他们冬天住在一个城市,夏天住在另一个城市怎么办?
  • 如果 parker samel 在冬天和夏天更改了地址。只需复制这样的记录 2014 Parker samel 23,Ny,usa (for sumer) 2014 Parker samel 192,Ny,usa (for冬天)我知道它重复的太多了,但要求是记录他过去所做的一切。

标签: mysql cakephp database-design model


【解决方案1】:

我认为,关系应该如下:-

  1. 用户有一个地址。
  2. 地址属于用户。

在地址中应该有如下字段:-

年份、user_id、姓名、address1、address2、address3 和 is_active

如果有任何地址发生变化,您需要生成新记录并克隆最后一条记录,并更新一条状态为激活和停用前一条记录的记录。

举个例子。

如果用户只修改了地址2---------

  1. 您将从最后一条记录中复制地址 1 和地址 3,并将状态设置为要插入的新记录的活动。

  2. 停用最后一条记录。

结论:- 一次只有一条记录处于活动状态,因此您可以处理与 hasOne 的关联。 您将能够管理历史更改的历史记录。

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点,最好的方法取决于您对应用的具体要求 - 我们现在还没有足够的知识来确定。

    但据我所知,听起来您基本上想要跟踪: a) 一个人 b) 一个人的工作地址 c) 一个人的家庭住址 d) 更改某人的姓名或某人的家庭或工作地址。 听起来“注册地址”只是他们最近的家庭住址。

    当有人更改姓名时,我绝对不会在 people 表中创建新记录 - 他们不是新人;他们是同一个人,但名字不同。同样,对于地址,您不一定要在某人的地址更改时创建新记录(您可能 - 取决于您的要求)。

    一个非常简单的方法是创建一个 people 表和一个 people_histories 表。

    人员表将存储人员姓名、人员工作和家庭住址。 people_histories 表只会跟踪对人员表中任何字段的更改。一个“人”将有许多“人历史”,每个“人历史”记录将指示更改的字段、更改的日期以及它之前持有的值。

    另一种方法是拥有人员、人员历史记录、地址和地址历史记录,并且人员拥有工作地址 ID 和家庭地址 ID。

    另一种方式是说一个人有多个地址,每个地址作为一个角色,“工作”或“家庭”,以及表明该人何时搬到该地址的日期。一个人最终可能会得到例如。 10 个工作地址,您知道当前的地址是最近日期的。

    实际上,最好的解决方案取决于您想对人们以前的姓名和地址做什么。如果您只想跟踪它们以供手动查看,并且它们并不是系统的真正核心部分,那么历史记录表可以让事情变得简单,并且运行良好。

    哦,还有一件事,您应该遵守 CakePHP 的约定,并将您的主键字段简单命名为“id”。如果你有多个指向同一张表的外键,而不是将它们命名为 address1_id 和 address2_id,我会描述性地命名它们,例如 home_address_id 和 work_address_id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多