我将用一个例子来说明这一点:
class Company {
}
class Person {
}
Company
和Person
拥有多对多关系。 Person
可以属于多个Companies
,而Company
可以包含多个People
。
那么我是否需要创建第三个类:
class CompanyPerson {
}
或该公司应该处理它:
class Company {
function add_person() {
}
}
或者Person
应该?
class Person {
function add_to_company() {
}
}
答案 0 :(得分:2)
Person
和Company
实例的某些随机组合所共有的属性可以使用“关联类”建模。
在UML中有一个符号,并且用可扩展的编程语言创建这样的概念并不难。
这个想法是由Person
和Company
组成的任意随机对象都有关系,而这种关系本身就是一个对象。它既不是Person
也不是Company
,而是与特定Person
和Company
实例之间的关联相关联的内容。
那些东西(属性,方法)构成一个类:Person-Company
关联类。
之前我在Lisp中使用了一些用于定义给定类对的关联类的宏,以及用于将对象对映射到其关联类对象的全局弱哈希表(以便对于给定的人和公司)有可能检索到关联,当这些对象变成垃圾时,该关联就会消失。
特定公司与人之间的实际联系很容易,例如,列表或其他关联数据结构。人物对象可以有公司列表,反之亦然。协会类的想法解决了在什么地方放置人员公司的问题。例如,每个Person
都有Company
内的角色(比方说)。我们在role
中不能有Person
变量,因为它可以在很多公司中扮演很多角色。我们当然不能在公司中拥有role
,因为它甚至不是一个人;它有与之相关的人员。角色可以进入关联:问题解决了。
答案 1 :(得分:2)
这完全取决于您的使用场景。
如果您只需找到为公司工作的人员,请将人员列表存储在公司;如果你只需要找到人们工作的公司,那就把它存放在那里。
迟早你可能会发现你需要建立实际关系Person< - > Company的模型,你将创建一个单独的类来表示它。现在,您可以处理添加属性,例如就业开始日期,结束日期等。
答案 2 :(得分:0)
我觉得你不需要第三节课。
想想ORM(Doctrin for php,Hybernate forn java)的作用:
在这种情况下,在数据库层上,您将有3个表:
公司,用户和公司_用户(用户和公司之间的联系表,说明哪个用户对哪个公司有好处)。
此外,您可以使用两个数据库表映射此情况:
公司,用户和用户,您有一个指向公司的参考。因此,根据此参考,您可以说用户所属的公司。
最后在课堂设计上我认为:
答案 3 :(得分:0)
这取决于用例,但通常可以使用引用类
部署多对多的对象关系class CompanyPersonRelationship {
public $company;
public $person;
}
现在,公司和个人都可以追踪他们的关系谎言
class Company {
public $persons = array();
}
class Person {
public $companies = array();
}