[英]Entity Framework Many-To-8 Relationship?
这可能是比Entity Framework更为广泛的SQL主题,在这两个领域我都是新手,但是我将以Entity Framework的名义提出这个问题。
我想执行多对八关系。 我的设置是这样的:
我尝试了以下方法:
1) 在Person和PersonGroup之间添加8个1..many关联。 使用此解决方案的每个组中,我当然不能超过8个人。 但是,要查找一个人所在的所有组,我需要在“人”字段中遍历8个变量,这很麻烦。
2) 向与Person匹配的PersonGroup添加8个id。 再一次,我只能保证每个组只有8个人,但是没有通过Person-> PersonGroup的关联自动返回的链接。 我现在需要确保将其添加到两个位置。
3) 要做很多...很多关系,并用代码处理它。 这样做有两个问题:我不能保证每组只有8个人,而且我不确定是否可以保证顺序保持不变。
那么,哪个是最好的,或者我缺少什么解决方案?
对我来说,多对多似乎还可以。 通过实施触发器,您可以轻松确保每个组的人数不超过8人。 另外,如果您认为订单列对您的逻辑很重要,则可以在该表中添加订单列。
n:m
与“捕获”的关系:
Person
------
PersonId
PRIMARY KEY (PersonId)
PersonGroup
-----------
GroupId
PRIMARY KEY (GroupId)
Belongs
-------
GroupId
PersonId
Ordering
PRIMARY KEY (GroupId, PersonId)
FOREIGN KEY (GroupId)
REFERENCES PersonGroup (GroupId)
FOREIGN KEY (PersonId)
REFERENCES Person (PersonId) --- all normal up to here
UNIQUE KEY (GroupId, Ordering) --- the "catch"
CONSTRAINT Ordering_chk --- ensuring only up to 8 persons
CHECK Ordering IN (1,2,3,4,5,6,7,8) --- per group
您应该确保将在您将使用的SQL引擎中使用CHECK
约束(例如,MySQL会欺骗您以为它具有这样的约束,但它只会忽略它们。SQL-Server不会返回错误,但会愉快地添加NULL
如果您尝试插入一个,请在选中的列中输入。)
这种方法有局限性。 Ordering
字段必须为NOT NULL
因为如果为NULL
,则可以插入多于8行(带有NULL的行)(SQL-Server除外,SQL-Server最多允许您输入9行,其中八行带有值,一行带有NULL。 )
为了确保Ordering
最多包含8行和NULL,您可以进行更复杂的约束,例如MSDN网站中描述的约束CHECK Constraints (如果您的RDBMS具有这种功能),但是我完全不确定这种性能一个怪兽:
CREATE FUNCTION CheckMax8PersonPerGroup()
RETURNS int
AS
BEGIN
DECLARE @retval int
SELECT @retval = CASE WHEN EXISTS
( SELECT *
FROM Belongs
GROUP BY GroupId
HAVING COUNT(*) > 8
)
THEN 0
ELSE 1
END
RETURN @retval
END;
GO
ALTER TABLE Belongs
ADD CONSTRAINT Ordering_chk
CHECK (CheckMax8PersonPerGroup() = 1 );
GO
约束也可以创建为8行参考表的FOREIGN KEY
。 (如果您使用MySQL,那是拥有CHECK
的唯一方法。)
一种变化是将(GroupId, Ordering)
用(GroupId, Ordering)
键,并且对(GroupId, PersonId)
组合没有任何限制。 这将允许一个Person
在一个Group
具有多个职位(但仍然最多8个)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.