我想要这个设置:
TABLE [group] :
[group_id] INT IDENTITY(1,1) --as pkey,
[member_one] INT NOT NULL --as fkey [member].[member_id],
[member_two] INT NULL --as fkey [member].[member_id],
[member_three] INT NULL --as fkey [member].[member_id],
...
TABLE [member] :
[member_id] INT IDENTITY(1,1) --as pkey,
[group_id] INT NOT NULL --as fkey [group].[group_id],
...
用文字: 我有成员组。 每个成员都有一个且只有一个组。
编辑1: 每个组至少有一个成员,member_one是领导者,无法更改。 每个小组可能拥有无限数量的成员,但只有一到三个(包括领导者)可以是我们称之为“#-head;"”的人员。 的 ---
如果我想在同一时间创建一个小组和一个领导者,我该怎么办? 我无法创建一个没有领导者的团队,而且我无法在不创建团队的情况下创建领导者。 我不想删除" NOT NULL"在两个表中。
我不知道如何使用存储过程,所以如果它使用它(我不会说它应该),那就这么简单!
提前致谢!
答案 0 :(得分:0)
您描述的问题仅仅是因为您违反了关系数据建模原则。 您不需要在两个表中都有成员,只是无缘无故地重复数据。
TABLE [group] :
[group_id] INT IDENTITY(1,1) --as pkey,
...
TABLE [member] :
[member_id] INT IDENTITY(1,1) --as pkey,
[group_id] INT NOT NULL --as fkey [group].[group_id],
[isLeader] BIT NOT NULL
...
您在[group]中创建组,然后将具有该组的成员添加到[member]表中。这使得查询更容易,更易于管理并适合RDBMS对话。通过简单的加入,您可以获得所需的所有信息。如果您的小组改为4名成员,那你很好。
答案 1 :(得分:0)
我会使用以下数据逻辑模型:
Group(GroupID - PK, ...)
GroupMemberType(GroupMemberTypeID - PK, Name, IsHeadStaff)
Example:
1 - Leader - 1
2 - Power member - 1
3 - Standard member - 2
Reason: this way we can add easily [new] types
Member(MemberID - PK, ..., GroupID - FK, GroupMemberTypeID - FK)
如果一个组只能拥有领导者,那么我会创建一个唯一的filtered index(假设GroupMemberTypeID = 1 - Leader
CREATE UNIQUE NONCLUSTERED INDEX INF_Member_GroupID_GroupMemberTypeID1
ON dbo.Member (GroupID)
WHERE GroupMemberTypeID = 1 -- Leader
要检查当前插入和/或更新的成员是否已分配给一个组,对于当前组,最多有3个主要工作人员我将使用AFTER INSERT/UPDATE
触发器:
CREATE TRIGGER trgIU_Member_CheckMax3HeadStaff
ON dbo.Member
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS(
SELECT *
FROM dbo.Member m JOIN dbo.GroupMemberType gmt ON m.GroupMemberTypeID = gmt.GroupMemberTypeID
WHERE m.GroupID IN (SELECT i.GroupID FROM inserted i)
AND gmt.IsHeadStaff = 1
GROUP BY m.GroupID
HAVING COUNT(*) > 3
)
BEGIN
ROLLBACK
RAISERROR('One group can have maximum three head staff members,', 16, 1)
END
END
答案 2 :(得分:-1)
我找到了一个对我很好的解决方案: