在mysql数据库中使用cakephp 2.4.3。人们总是有三个地址。
这两个表就像人的时间线。(意味着记录会增加加班时间),例如,如果你在现实生活中更改了你的名字。您必须在people表中添加新记录。对一个人来说是这样的。
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 )住在他的官邸。2014年,他搬到了美国纽约州23家。2015年,他在俄罗斯工作。
我有两个问题。
首先,我在people表中创建了3个外键(address_id、address2_id、address3_id)和专用的3个地址id,仅供1人使用。在人的餐桌上。people_id(PK),name,address_id(FK),address2_id(FK),address3_id(FK)
在地址表里。address_id(PK),address_name
它比在地址表(people_id)中制作一个外键更好吗?在人的餐桌上。people_id(PK),名称
在地址表里。address_id(PK)、address_name、people_id(FK)、address_type (注册、生活、工作)
第二,我的方法是否不好。我想知道如何配置模型和saveAssociated(),或者如何将事务保存在cakephp中学习。
发布于 2013-12-07 02:52:45
我认为,这种关系应该如下:-
在地址上,应该有以下字段:
年,user_id,name,address1,address2,address3和is_active
如果要更改任何地址,则需要使用最后一条记录的克隆生成新记录,并使用状态为活动的更新记录生成新记录,并将前一条记录停用。
举个例子。
如果用户只修改address2
结论:-在同一时间,只有一个记录是活跃的,所以你可以处理与hasOne的关联。你将能够管理历史变迁的历史。
发布于 2013-12-07 05:11:06
有很多方法可以做到这一点,最好的方法将取决于你对你的应用程序的具体需求-我们现在还不知道说得肯定。
但据我所见,听起来你基本上是想跟踪:( a)一个人( b)一个人的工作地址( c)一个人的家庭地址( d)更改一个人的名字,或者一个人的家庭或工作地址。听起来“注册地址”只是他们最近的家庭住址。
当一个人改名时,我肯定不会在people表中创建一个新记录--他们不是新的人;他们是同一个人,有着不同的名字。同样,对于地址,您不一定希望在某人的地址更改时创建新记录(您可能--取决于您的需求)。
一个非常简单的方法是有一个people表和一个people_histories表。
people表将同时存储个人姓名以及工作人员的工作和家庭地址。people_histories表只跟踪人员表中任何字段的更改。一个'person‘将有许多'person_histories',每个'person_history’记录将指示被更改的字段、更改的日期以及它以前保存的值。
另一种方法是拥有人员、people_histories、addresses和address_histories,并且一个人有一个work_address_id和一个home_address_id。
另一种方式是说一个人的has_many地址,每个地址作为一个角色,要么‘工作’或‘家’,以及日期表明该人何时搬到该地址。一个人最终可能会有这样的结果。10个工作地址,你知道当前的是最近的一个。
实际上,最好的解决方案取决于您想要如何处理人们以前的姓名和地址。如果您只想跟踪它们以便手动查看,而且它们实际上并不是系统的核心部分,那么历史表可以保持简单,并且工作正常。
哦,还有一件事,您应该坚持CakePHP约定,并将您的主键字段命名为'id‘。如果您有多个指向同一个表的foriegn键,而不是将它们命名为address1_id和address2_id,我会将它们命名为描述性的,比如home_address_id和work_address_id。
https://stackoverflow.com/questions/20436871
复制相似问题