0

我有一个包含以下表格的数据库架构:

  • 人们
  • 组织
  • 关系类型

我要设计的是关系类型的概念,然后是关系的结构。因此,一个人可以与另一个人或与一个组织建立某种关系。一个组织可以与另一个组织或个人建立关系。

我有以下架构,但我想通过社区运行它,看看是否有更好的想法。

CREATE TABLE OrganisationRelationshipTypes
(
    ID INT PRIMARY KEY IDENTITY,
    RelationshipTypeID INT NOT NULL REFERENCES RelationshipTypes(ID)
    FromOrganisationID INT NOT NULL REFERENCES Organisations(ID),
    ToOrganisationID INT NOT NULL REFERENCES Organisations(ID)
)

CREATE TABLE PersonRelationshipTypes
(
    ID INT PRIMARY KEY IDENTITY,
    RelationshipTypeID INT NOT NULL REFERENCES RelationshipTypes(ID),
    FromPersonID INT NOT NULL REFERENCES People(ID),
    ToPersonID INT NOT NULL REFERENCES People(ID)
)

CREATE TABLE OrganisationPersonRelationshipTypes
(
    ID INT PRIMARY KEY IDENTITY,
    RelationshipTypeID INT NOT NULL REFERENCES RelationshipTypes(ID)
    FromOrganisationID INT NOT NULL REFERENCES Organisations(ID),
    ToPersonID INT NOT NULL REFERENCES People(ID)
)

CREATE TABLE PersonOrganisationRelationshipTypes
(
    ID INT PRIMARY KEY IDENTITY,
    RelationshipTypeID INT NOT NULL REFERENCES RelationshipTypes(ID)
    FromPersonID INT NOT NULL REFERENCES People(ID),
    ToOrganisationID INT NOT NULL REFERENCES Organisations(ID)
)

这样做的想法是它涵盖了这样的场景:

  • 一个组织与另一个组织有业务往来
  • 一个人是另一个人的父亲
  • 一个组织最近雇用了这个人
  • 一个人最近为该组织工作

这个模式似乎有点乱,但此刻我想不出替代方案。

你有什么建议吗?

4

2 回答 2

2

Party通常用作个人或组织的通用术语,如“合同各方”......

在此处输入图像描述

于 2012-08-09T12:02:38.410 回答
1

看起来很好。

我建议将所有关系表压缩成一个

CREATE TABLE RelationShips (
    ID INT PRIMARY KEY IDENTITY,
    RelationshipTypeID INT NOT NULL REFERENCES RelationshipTypes(ID),
    FromPersonID INT REFERENCES People(ID),
    ToPersonID INT REFERENCES People(ID),
    FromOrganisationID INT REFERENCES Organisations(ID),
    ToOrganisationID INT REFERENCES Organisations(ID)
)

这样,您只需一次数据库查找即可轻松过滤关系。即“查找与特定人的所有关系”。当然,您需要删除NOT NULL约束。

于 2012-08-09T06:39:10.173 回答