我想通过使用几乎多态的方法来解决这个问题。你可以只用两个表,就像这样:
CREATE TABLE Node (id UNIQUEIDENTIFIER NOT NULL, PRIMARY KEY (id));
CREATE TABLE Relationships (
parent UNIQUENIDENTIFIER NOT NULL,
child UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT FK_Relationship_ParentNode
FOREIGN KEY (parent) REFERENCES Node(id),
CONSTRAINT FK_Relationship_ChildNode
FOREIGN KEY (child) REFERENCES Node(id)
);
那么所有其他实体节点“继承”:
CREATE TABLE Person (
id UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR(50) NOT NULL,
CONSTRAINT FK_Person_Node
FOREIGN KEY (id) REFERENCES Node(id)
);
CREATE TABLE ParkingLot (
id UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR(50) NOT NULL,
address NVARCHAR(250) NOT NULL, -- bad way to model
CONSTRAINT FK_ParkingLot_Node
FOREIGN KEY (id) REFERENCES Node(id)
);
CREATE TABLE Food (
id UNIQUEIDENTIFIER NOT NULL,
name NVARCHAR(50) NOT NULL,
calories INT NOT NULL, -- hopefully only needs an int ;)
CONSTRAINT FK_Food_Node
FOREIGN KEY (id) REFERENCES Node(id)
);
所以现在你可以模拟任何两个实体之间的关系,并找一找使用连接。
例如,如果你想找到哪些食物属于哪个人,你可以说:
SELECT p.name AS person, f.name AS food
FROM Person AS p
INNER JOIN Relationships AS r
ON r.parent = p.id
INNER JOIN Food AS f
ON f.id = r.child
当然,如果你再想要找到的东西在层次更深一点,你需要专门查询每个级别。但是,因为你的实体(假定)是真实的东西,而不仅仅是层次结构中的层次,所以应该没问题:)。
relationship_type =“Parking_lot”,“Car”,“Person” – 2010-09-15 21:21:01