代码之家  ›  专栏  ›  技术社区  ›  roman m

如何管理数据库中的“组”?

  •  2
  • roman m  · 技术社区  · 15 年前

    我问过这个问题 here 但我不认为我的观点是正确的。

    假设我有以下表(所有pk都是标识字段):

    • 人员(个人ID(PK)、姓名、SSN等)
    • 贷款(贷款ID(pk)、金额等)
    • 借款人(borrowerid(pk)、personid、loanid)

    假设史密斯先生以他的名义得到了2笔贷款,3笔与妻子的联合贷款,1笔与情妇的联合贷款。为了申请的目的,我想把人组织起来,这样我就可以很容易地把史密斯先生和他妻子一起贷出去。

    为了实现这一点,我添加了borrowergroup表,现在我有了以下内容(所有pk都是标识字段):

    • 人员(个人ID(PK)、姓名、SSN等)
    • 贷款(贷款ID(PK)、金额、借款类别等)
    • borrowergroup(groupid(pk))。
    • 借款人(borrowerid(pk)、groupid、personid)

    现在,史密斯先生分为三组(他本人、他和他的妻子、他和他的情妇),我可以很容易地在这些组中查找他的活动。

    新设计的问题:

    生成新的borrowergroup的唯一方法是插入max(gourpid)+1,并打开identity_insert,这感觉不太对劲。另外,一个带有1列的表的概念有点奇怪。

    我坚信代孕钥匙,如果可能的话,我会坚持这个设计。

    此应用程序不关心个人,将组视为个人

    是否有更好的方法来为该应用程序分组人员?

    6 回复  |  直到 15 年前
        1
  •  1
  •   Community c0D3l0g1c    7 年前

    数据库的设计似乎还可以。为什么创建新组时必须使用max(gourpid)+1?不能先创建行,然后使用scope_identity()返回新的ID吗?

    例如

    INSERT INTO BorrowerGroup() DEFAULT VALUES
    SELECT SCOPE_IDENTITY()
    

    (见 this other question )

    (编辑到SQL,由 this question )

        2
  •  3
  •   Daniel Brückner Pradip    15 年前

    你可以把桌子移走 BorrowerGroups -它没有信息。此信息已通过 Loans People 分享-我只是假设你有 PeopleLoans 表。

    People          Loans           PeopleLoans
    -----------     ------------    -----------
    1  Smith         6  S1    60    1   6
    2  Wife          7  S2    60    1   7
    3  Mistress      8  S+W1  74    1   8
                     9  S+W2  74    1   9
                    10  S+W3  74    1  10
                    11  S+M1  89    1  11
                                    2   8
                                    2   9
                                    2  10
                                    3  11
    

    所以你的 借款人群体 实际上几乎是 贷款 -只有史密斯6人和7人,史密斯和妻子8至10人,史密斯和情妇11人。 所以没有必要 借款人群体 首先,因为它们与 贷款 按相关人员分组 .

    但是要有效地检索这些信息可能非常困难,因此您可以考虑添加 GroupId 直接到 贷款 . 忽略的第二列 贷款 (只是为了可读性)第三列可以代表您的组。它们是多余的,所以如果你改变它们,你必须小心。

    如果你找到了一个很好的方法 群氓 根据相关人员的ID,可以将其设置为计算列。如果一个字符串可以作为一个组ID,那么您可以用一个分隔符将这些人的ID排序为concat。

    60 只有史密斯才能拿到身份证 '1' ,群 74 将成为 1.2 和群 89 将成为 1.3 . 不是很聪明,而是独特且易于计算。

        3
  •  2
  •   KM.    15 年前

    使用原始架构:

    • 人员(个人ID(PK)、姓名、SSN等)
    • 贷款(贷款ID(pk)、金额等)
    • 借款人(borrowerid(pk)、personid、loanid)

    只需查询您需要的数据(您的示例是在同一笔贷款上查找夫妻):

    SELECT
        l.*
        FROM Borrowers            b1
            INNER JOIN Borrowers  b2 ON b1.LoanId=b2.LoanId
            INNER JOIN Loans       l ON b1.LoanId=l.LoanId
        WHERE b1.PersonId=@HusbandID
            AND b2.PersonId=@WifeID
    
        4
  •  0
  •   BobbyShaftoe    15 年前

    我会这样做:

    • 人员(个人ID(PK)、姓名、SSN等)

    • 贷款(贷款ID(PK)、金额、借款类别等)

    • borrowergroup(borrowergroupid(pk))。

    • 属于borrowergroup的人员(borrowergroupid (pk)、个人ID(pk)

    我把借贷者的桌子扔掉了。只需将信息存储在borrowergroup表中。这是我的偏好。

        5
  •  0
  •   Richard    15 年前

    共识似乎是省略了BorrowerGroup表,我必须同意。建议您使用max(groupid+1)有各种酸性/事务问题,以及标识字段存在的主要原因。

    也就是说,KM提供的SQL看起来不错。有很多方法可以得到相同的结果。联接、子选择等。真正的问题是…知道数据集。考虑到您提供的解释,数据集将非常小。它还支持删除borrowergroup表。

        6
  •  0
  •   JeffO    15 年前

    我会有一个小组表,然后是一个小组成员(借款人)表来完成贷款和人之间的多对多关系。这允许跟踪组中的数据,而不仅仅是成员列表(我相信其他人提出了这个建议?).

    CREATE TABLE LoanGroup
    (
        ID int NOT NULL 
        , Group_Name char(50) NULL 
        , Date_Started datetime NULL 
        , Primary_ContactID int NULL
        , Group_Type varchar(25)
    )