SQL - 表创建 - 1到3

时间:2016-06-09 18:42:08

标签: sql sql-server

我想要这个设置:

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"在两个表中。

我不知道如何使用存储过程,所以如果它使用它(我不会说它应该),那就这么简单!

提前致谢!

3 个答案:

答案 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)

我找到了一个对我很好的解决方案:

  • 创建一个函数,该函数返回组中的领导者数量
  • 添加一项检查并查看上一个函数是否返回0
  • 创建另一个函数,该函数返回这些人员在我的组中的人数
  • 添加另一个检查并查看第二个函数是否返回< 3