我不是数据库程序员。我真的不打算成为一个人,我试着去做。我的技能和工作都在别处,这些都让我很忙。然而,我发现自己有时在一个我没有时间或需要流利学习的领域里需要一些快速的帮助,而且还在乞求帮助。我已经正式尝试了一些尝试来建立几个新的表格,但没有结果。我大部分的学习都是在现场进行的,一旦我得到了一些指导(我想这就是我所要求的)并实现了它,我就会知道这个特定的模式是如何工作的。
尽管如此,以下内容是四年前@RolandoMySQLDBA提出的,我发现它对于我正在构建的项目来说非常棒。
我希望他能看到这一点,并希望他或其他人能帮助我将其扩展到包括一个“组织”表和一个组织rel_types表,以便与任何一个人联系在一起。
CREATE TABLE person
(
person_id INT NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (person_id)
);
CREATE TABLE relationship
(
rel_id INT NOT NULL AUTO_INCREMENT,
person_id1 INT NOT NULL,
person_id2 INT NOT NULL,
reltype_id TINYINT,
PRIMARY KEY (rel_id),
UNIQUE KEY outer_affinity (reltype_id,person_id1,person_id2),
UNIQUE KEY inner_affinity (reltype_id,person_id2,person_id1),
KEY has_relationship_to (person1_id,reltype_id),
KEY has_relationship_by (person2_id,reltype_id)
);
CREATE TABLE relation
(
reltype_id TINYINT NOT NULL AUTO_INCREMENT,
rel_name VARCHAR(20),
PRIMARY KEY (reltype_id),
UNIQUE KEY (rel_name)
);
INSERT INTO relation (relation_name) VALUES
('friend'),('follower'),('foe'),
('forgotabout'),('forsaken'),('fixed');我将非常感激任何能在这方面帮助我的人。
发布于 2016-09-20 17:44:48
如果您想保持简单,那么添加organization(organization_id PK, ...)表和person_organization_relationship (person_org_relationship_id (PK) , person_id,organization_id ,reltype_id , date_from, date_thru)就足够了。取决于您可能添加或不添加唯一约束的需求,例如(person_id, organization_id,reltype_id)。我将重用同一个relation表,用于描述人与人之间的关系。在许多情况下,这样的模型会运行得很好。
如果需要更通用的模型,可以添加Party的概念。党可以是一个人,或组织,或其他与系统互动的东西。例如,如果RDBMS支持枚举,则可以使用
PARTY (party_id PK, party_type enum('person','organization'), [common attributes]);然后添加两个表,PERSON和ORGANIZATION (它们都将party_id作为主键和外键存储到PARTY中)并分别存储它们的属性,或者将所有属性存储在PARTY表中。
“党”的概念允许你将个人和组织之间的任何类型的关系,或者两个组织,或者两个人存储在一个表中。向前看,它将使其他事情更易于实现。例如,各种联系信息,如地址(物理或电子),电话等可以存储在一个地方。另一方面,它也有它的价格。您要实现的通用模型越多,您在开始时就需要花费更多的时间。
因此,我建议使用最简单的满足需求的模型。
关于relationship表当前物理实现的一些注意事项:
UNIQUE KEY outer_affinity (reltype_id,person_id1,person_id2),
UNIQUE KEY inner_affinity (reltype_id,person_id2,person_id1),
KEY has_relationship_to (person1_id,reltype_id),
KEY has_relationship_by (person2_id,reltype_id)reltype_id)作为outer_affinity和inner_affinity中的领先列outer_affinity,inner_affinity就足够了UNIQUE KEY UQ_relationship_person_1_person_2 (person_id1, person_id2, reltype_id)和INDEX IDX_relationship_person_2(person_id2)开始(取决于典型的查询,作为这个索引的第二列,person_id1可能会很有用)。date_from (可能还有date_thru)属性。https://dba.stackexchange.com/questions/150149
复制相似问题