适应一对多和一对一(或一对一)关系的最佳做法是什么?

时间:2009-07-07 20:30:27

标签: sql database sql-server-2005

只是好奇解决以下问题的最佳做法是什么。我有机构,帐户和用户表。机构和账户有一对多的关系。机构和用户之间存在一对多的关系。用户和帐户具有多对多关系,或者他们可以拥有多对多(或*)帐户。这意味着,可以将用户指定给所有帐户,以及添加到用户可以访问的机构中的任何新帐户,而无需明确添加关系。

3 个答案:

答案 0 :(得分:2)

我会这样做:

Institutions
    InstitutionID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    Name VARCHAR(255)

Users
    UserID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    Username VARCHAR(255) NOT NULL
    InstitutionID INT NOT NULL

Accounts
    AccountID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    Account VARCHAR(255) NOT NULL
    InstitutionID INT NOT NULL

Users_Accounts
    Users_AccountsID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
    UserID INT NOT NULL
    AccountID INT NULL

NULL表中具有Users_Accounts条目的UserID具有全局(*)访问权限。这样,您就可以确定任何帐户和/或用户的机构,以及他们的权限。

编辑:不同表中具有相同名称的列表示外键。如果你没有重负荷,请使用它们。

答案 1 :(得分:1)

Accounts拥有Institutions的外键。

Users拥有Institutions的外键。

Users帐户上设置一个标记,表明他们可以访问Accounts上的所有Institution

UsersAccounts创建多对多映射表。仅当User未设置其标记以便他们可以访问Accounts上的所有Institution时,才会使用此选项。

这可以解决您的问题。

答案 2 :(得分:0)

将映射表用于多对多关系。如果用户有多个帐户,请创建一个包含两列的users_to_account映射表,一列包含帐户外键,另一列包含用户外键,我甚至可以将它们组合成一个复合主键:

users           account
-----           ----------
1               5
1               10
2               5
2               10

因此,帐户5和10都映射到用户1和2。