我使用 Milkman 示例来解释我想要实现的目标。
我有一个主职业,有一个PK和十几个FK。我们姑且称其为送奶工吧。 FK 与他所属的不同“类别”相关。例如,他是一个人(ID详细信息,性别,wtv),他有一个雇主(TaxId,姓名,位置),他有一个家庭(配偶,后代),那些后代是人..你明白了。
所以我已经有了一个方案,其中有几张表,它们之间有关系,所有表都通向我的送奶工表。因此,送奶工,因此他毕竟是送奶工,将通过上述路径分配其产品。路径由不同的机构组成,它们可以是“房屋”(一种类别)或“公司”(另一种类别)或...... - 假设还有更多可能性。房屋和公司都有自己的 ID (PK)。
每个送奶工都有自己的路。因此,例如,送奶工 1 将先去 House1,然后去 House2,然后在 Company1 结束一天的工作。
我的C背景要求我做一个链表:每个类都会有一个“上一个ID”和一个“下一个ID”字段。使用它我可以链接东西。但这些东西实际上并没有通过 FK 相互关联。 因此,如果我绘制数据库方案,Houses 和 Companies 都是与 Milkman 无关的表。他们真的不会执着于任何东西。
那么,有没有办法解决这个问题,在送奶工和他的送货地点之间建立关系?
如果没有,如果我们只有房屋而没有公司(只有一级)是否可以做到?
我不知道我是否遗漏了一些东西(我糟糕的 SQL 知识已经有一段时间没有经过测试了),或者我是否过于专注于创建关系 PK-FK 而没有必要,我可以在 C# 编程层以另一种方式解决问题(例如 DELETE CASCADE)。
这是您可以使用的表结构
Create Table EstablishmentType (
pkEstablishmentType integer IDENTITY(1,1),
TypeName varchar(512),
created_at datetime DEFAULT (getdate())
);
INSERT INTO EstablishmentType (TypeName) VALUES
('Residential'),
('Business'),
('Orphanage'),
('Hospital'),
('School'),
('Special');
SELECT * FROM EstablishmentType
Create Table DeliveryGroup(
pkDeliveryGroup integer IDENTITY(1,1),
GroupName varchar(512),
Duration integer,
Milage integer,
FuelCost integer,
);
INSERT INTO EstablishmentType (TypeName) VALUES
('Residential Morning route'),
( 'Residential Afternoon route'),
( 'Business Morning route'),
( 'Business Afternoon route'),
( 'Special Deliveries');
SELECT * FROM EstablishmentType
Create Table Staff (
pkStaff integer IDENTITY(1,1),
Firstname varchar(512),
Lastname varchar(512),
Job varchar(512),
DOB varchar(20),
Sex varchar(20),
Supervisor integer,
created_at datetime DEFAULT (getdate())
);
INSERT INTO Staff (Firstname,Lastname,Job,DOB,Sex,supervisor) VALUES
('Amanda','Jones','Supervisor','1990-1-1','F',-1),
('John','Smith','DeliveryDriver','2000-1-1','M',1);
SELECT * FROM Staff
Create Table Establishment(
pkEstablishment integer IDENTITY(1,1),
fkEstablishmentType integer,
Name varchar(512),
Address varchar(512),
created_at datetime DEFAULT (getdate())
);
INSERT INTO Establishment (fkEstablishmentType,Name,Address) VALUES
(1,'Mr Adams','123 South ave'),
(1,'Mr Carie','124 South ave'),
(1,'Ms Walls','126 South ave'),
(2,'Express Resto','127 South ave'),
(2,'Subway','128 South ave');
SELECT * FROM Establishment
Create Table Delivery (
pkDelivery integer IDENTITY(1,1),
fkDeliveryGroup integer,
fkStaff integer,
fkEstablishment integer,
comment varchar(512),
deliverySchedule_at datetime,
deliveryCompleted_at datetime
);
INSERT INTO Delivery (fkDeliveryGroup,fkStaff,fkEstablishment) VALUES
(1,1,1),
(1,1,2),
(1,1,3),
(1,2,4),
(1,2,5);
SELECT * FROM Delivery