我有點匆忙,我可能會迷失在你的要求中。 (但是+1很清楚地說明了他們)。我們首先解決這個簡單的問題。我主要在這裏使用自然鍵,因爲自然鍵可以更容易地看到發生了什麼。我認爲,對你來說真正重要的部分是重疊的外鍵約束(接近尾聲)。
簡單的東西 - 零件,供應商和角色的表格。
create table test.parts (
part_num varchar(15) primary key
);
insert into test.parts values
('Part A'), ('Part B'), ('Part C');
-- "Suppliers" provide parts.
create table test.suppliers (
supplier_name varchar(35) primary key
);
insert into test.suppliers values
('Supplier A'), ('Supplier B'), ('Supplier C');
create table test.roles (
role_name varchar(15) primary key
);
insert into test.roles values
('Role 1'), ('Role 2'), ('Role 3');
一個要求:每個部分都完成一個角色。 (更多關於UNIQUE約束,和有關使用該表,而不是簡單地增加一個列「份」後面。)
create table test.part_roles (
part_num varchar(15) primary key references test.parts (part_num),
role_name varchar(15) not null references test.roles (role_name),
unique (part_num, role_name)
);
insert into test.part_roles values
('Part A', 'Role 1'), ('Part B', 'Role 1'), ('Part C', 'Role 2');
另一個要求 - 每個供應商可以提供一個或多個部分實現相同的作用。我認爲這簡化爲「每個供應商提供多個零件」。 (存儲關於哪個角色的一部分屬於事實是不同的表的責任。)
create table test.supplied_parts (
supplier_name varchar(35) not null
references test.suppliers (supplier_name),
part_num varchar(15) not null references test.parts (part_num),
primary key (supplier_name, part_num)
);
insert into test.supplied_parts values
('Supplier A', 'Part A'),
('Supplier A', 'Part B'),
('Supplier A', 'Part C'),
('Supplier B', 'Part A'),
('Supplier B', 'Part B');
另一個要求 - 管理者決定哪些部分將要訂購。 (用GRANT和REVOKE處理經理。)只有一個完成特定角色的部分可以進行訂購。(這意味着role_name上的主鍵約束或唯一約束)。除非有人提供它,否則您不能訂購零件。 (所以我們需要重疊外鍵約束。)
這就是我前面提到的test.part_roles UNIQUE約束(PART_NUM,ROLE_NAME)的用武之地。
create table test.orderable_parts (
role_name varchar(15) primary key references test.roles,
part_num varchar(15) not null,
foreign key (part_num, role_name)
references test.part_roles (part_num, role_name),
supplier_name varchar(35) not null,
foreign key (supplier_name, part_num)
references test.supplied_parts (supplier_name, part_num)
);
insert into test.orderable_parts values
('Role 1', 'Part A', 'Supplier A'),
('Role 2', 'Part C', 'Supplier A');
我想你」可能用單獨的part_roles表更好。 (例如,比向零件添加列更好)。供應商通常會提供更多的零件,而不是您現在的,但企業通常希望提前計劃,在零件承諾使用前收集有關零件的信息(在您的案例中,在一個特定的角色)。
謝謝!這應該很好地滿足要求。獎勵! – Oxynatus