【问题标题】:What is the best practice for accommodating both a one-to-many and a one-to-all (or one-to-*) relationship?适应一对多和一对多(或一对*)关系的最佳实践是什么?
【发布时间】:2009-07-07 20:30:27
【问题描述】:

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

【问题讨论】:

  • 一个用户可以访问(关联)多个机构的账户吗?如果是,“超级用户”是否可以访问一个机构的所有账户、一组机构的所有账户或所有机构的所有账户? (如果不是,那么我们将考虑对帐户分配的限制。)
  • 不,一个用户不能与多个机构关联

标签: sql database sql-server-2005


【解决方案1】:

我会这样做:

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

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

编辑:不同表中具有相同名称的列意味着外键。如果您不做重负荷,请使用它们。

【讨论】:

    【解决方案2】:

    使Accounts 具有Institutions 的外键。

    使Users 具有Institutions 的外键。

    Users 帐户上创建一个标志,表明他们将有权访问该Institution 上的所有Accounts

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

    这应该可以解决您的问题。

    【讨论】:

      【解决方案3】:

      为多对多关系使用映射表。如果一个用户有很多账户,创建一个包含两列的 users_to_account 映射表,一列是账户外键,一列是用户外键,我什至会将它们组合成一个复合主键:

      用户帐户 ----- ---------- 1 5 1 10 2 5 2 10

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

      【讨论】:

      • 是的,埃里克,我不确定。我今天有点阴天,正在感冒中恢复。
      • 当您可以将 FK 放在 Account 表上时,为什么还要使用查找表(以及另一个联接!)?查找一对多关系没有任何意义,只是标准的 3NF。此外,您还没有解决多对多方面的问题。因此,我选择了 -1。
      • 我更新了我的答案以解决多对多问题。正如您所说,在一对多中,跳过映射表,只需在“一”表(即帐户表)中放置一个 FK
      猜你喜欢
      • 1970-01-01
      • 2012-01-05
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多