首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将组织架构添加到现有的人员/关系架构

将组织架构添加到现有的人员/关系架构
EN

Database Administration用户
提问于 2016-09-20 12:48:23
回答 1查看 80关注 0票数 2

我不是数据库程序员。我真的不打算成为一个人,我试着去做。我的技能和工作都在别处,这些都让我很忙。然而,我发现自己有时在一个我没有时间或需要流利学习的领域里需要一些快速的帮助,而且还在乞求帮助。我已经正式尝试了一些尝试来建立几个新的表格,但没有结果。我大部分的学习都是在现场进行的,一旦我得到了一些指导(我想这就是我所要求的)并实现了它,我就会知道这个特定的模式是如何工作的。

尽管如此,以下内容是四年前@RolandoMySQLDBA提出的,我发现它对于我正在构建的项目来说非常棒。

我希望他能看到这一点,并希望他或其他人能帮助我将其扩展到包括一个“组织”表和一个组织rel_types表,以便与任何一个人联系在一起。

代码语言:javascript
复制
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');

我将非常感激任何能在这方面帮助我的人。

EN

回答 1

Database Administration用户

发布于 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支持枚举,则可以使用

代码语言:javascript
复制
PARTY (party_id PK, party_type enum('person','organization'), [common attributes]);

然后添加两个表,PERSONORGANIZATION (它们都将party_id作为主键和外键存储到PARTY中)并分别存储它们的属性,或者将所有属性存储在PARTY表中。

“党”的概念允许你将个人和组织之间的任何类型的关系,或者两个组织,或者两个人存储在一个表中。向前看,它将使其他事情更易于实现。例如,各种联系信息,如地址(物理或电子),电话等可以存储在一个地方。另一方面,它也有它的价格。您要实现的通用模型越多,您在开始时就需要花费更多的时间。

因此,我建议使用最简单的满足需求的模型。

关于relationship表当前物理实现的一些注意事项:

代码语言:javascript
复制
     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)
  1. 最好不要将最小选择列(reltype_id)作为outer_affinityinner_affinity中的领先列
  2. 为了执行唯一性,有一个outer_affinityinner_affinity就足够了
  3. 我从两个索引UNIQUE KEY UQ_relationship_person_1_person_2 (person_id1, person_id2, reltype_id)INDEX IDX_relationship_person_2(person_id2)开始(取决于典型的查询,作为这个索引的第二列,person_id1可能会很有用)。
  4. 表似乎缺少date_from (可能还有date_thru)属性。
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/150149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档