SQL中的Milkman问题:如何在不丢失FK关系的情况下创建链表

问题描述 投票:0回答:1

我使用 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)。

sql
1个回答
0
投票

这是您可以使用的表结构

https://dbfiddle.uk/v3dANOdd

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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.