我尝试为以下结构构建数据库模型: 我有最高 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单位。任何人都可以帮助我,我无法想出正确的设计。
答案 0 :(得分:0)
对于这样的事情 - 确保你不要把自己放进一个角落里。例如:
我的公司最多有3个层次
没有。你的公司目前有多达3个等级。当他们中的一个决定拥有4个时,他们不想尖叫你。
我建议阅读数据模型资源书第1卷 - 它们描述了各种各样的东西和标准数据模式,其中包括实体组织(实体在“法律,人或组织实体”中,包括组织结构。事情很多当你不想让自己陷入一个角落时会更加复杂,这会使得程序在不太远的将来需要重写。
答案 1 :(得分:0)
您需要确定组织结构是否是纯粹的层次结构(组织单位只能属于0或1个其他组织单位),或者它是否是图形(组织单位可以属于0,1或者1个组织单位)。
您的限制为3是业务规则,应由数据库逻辑(触发器)强制执行,而不是数据库架构。
为什么带有名称的代码?
如果是分层,这是您的架构:
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)
);