繁体   English   中英

实体框架多对八关系?

[英]Entity Framework Many-To-8 Relationship?

这可能是比Entity Framework更为广泛的SQL主题,在这两个领域我都是新手,但是我将以Entity Framework的名义提出这个问题。

我想执行多对八关系。 我的设置是这样的:

  • 一个PersonGroup需要8个(唯一)人员。
  • 一个人可以在许多不同的人组中。
  • PersonGroup的顺序很重要(第一个需要保留在第一位,依此类推)。
  • 轻松访问一个PersonGroup和一个Person所在的所有PersonGroup中的所有人。

我尝试了以下方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM