设计多层次的公司结构

时间:2014-05-28 08:11:10

标签: sql-server database-design

我尝试为以下结构构建数据库模型: 我有最高 3个层次级别的公司。对于每个单位我都有一个值(这些值是随机给出的,公司之间(不在内)之间的重复是可能的。让我们说(1级:222-亚马逊,2级:441-亚马逊:德国,542-大不列颠,3级:6-Distribution,99-Shop,124-Programming,5-HR。 当然,对于每家公司来说,情况都不同。我做的是:

Table1:
ID_Worker
CompanyName
ID_CompanyLvL1
ID_CompanyLvL2
ID_CompanyLvL3
...
Table2:
ID_CompanyLevel1
Slot1
Slot2
...
Table3:
ID_CompanyLevel2
Slot1
Slot2
...

但是通过这种方法,我遇到了以下问题:如果两家公司的公司级别(2或3)具有相同的编号,我就不能再用它们了。

另一种不起作用的方法是

   Table1:
    ID_Company
    ID_Worker
    ID_CompanyLevel1
    ...
    Tabel2:
    ID_CompanyLevel1
    Slot1
    ID_CompanyLevel2
    ...
    Table3:
    ID_CompanyLevel2
    Slot
    ID_CompanyLevel3
    ...

通过这种方法,我无法确定哪个人在...哪个level2单位。任何人都可以帮助我,我无法想出正确的设计。

2 个答案:

答案 0 :(得分:0)

对于这样的事情 - 确保你不要把自己放进一个角落里。例如:

  

我的公司最多有3个层次

没有。你的公司目前有多达3个等级。当他们中的一个决定拥有4个时,他们不想尖叫你。

我建议阅读数据模型资源书第1卷 - 它们描述了各种各样的东西和标准数据模式,其中包括实体组织(实体在“法律,人或组织实体”中,包括组织结构。事情很多当你不想让自己陷入一个角落时会更加复杂,这会使得程序在不太远的将来需要重写。

答案 1 :(得分:0)

  1. 您需要确定组织结构是否是纯粹的层次结构(组织单位只能属于0或1个其他组织单位),或者它是否是图形(组织单位可以属于0,1或者1个组织单位)。

  2. 您的限制为3是业务规则,应由数据库逻辑(触发器)强制执行,而不是数据库架构。

  3. 为什么带有名称的代码?

  4. 如果是分层,这是您的架构:

    create table organizations (
      organization_id int primary key,
      name varchar(whatever) not null,
      parent_id int null references organizations(organization_id)
    );
    

    使用Recursive Common Table Expressions进行查询。

    如果是图形,这是您的架构:

    create table organizations (
      organization_id int primary key,
      name varchar(whatever) not null
    );
    
    create table organizations_structure (
      parent_organization_id int references organizations(organization_id),
      child_organization_id int references organizations(organization_id),
    
      primary key (parent_organization_id, child_organization_id),
    
      check (parent_organization_id <> child_organization_id)
    );