【问题标题】:How do I relate a username table to equipment and employee tables?如何将用户名表与设备和员工表相关联?
【发布时间】:2015-07-03 05:02:04
【问题描述】:

我有一个包含多个表和关系的数据库。我正在使用 Microsoft Access,但我的想法是使用 MySQL 迁移到我们的 Linux 服务器。

我有一个设备表(或任何具有 IP 地址的设备,例如笔记本电脑、服务器、交换机等)和另一个员工表(我的设计比这更复杂,但我简化了用于解释目的的问题)。我还有另一个表用于存储用户名、密码、用户名角色和范围(本地、域、WordPress、电子邮件等)。

我在 SQL 中的问题的简化版本(无关字段已被省略):

CREATE TABLE employees (
    IdEmployee INT NOT NULL,
    EmployeeName VARCHAR(50),
    EmployeeDepartment INT,
    PRIMARY KEY (IdEmployee)
);

CREATE TABLE devices (
    IdDevice INT NOT NULL,
    DeviceType INT,
    Brand INT,
    Model VARCHAR(30),
    PRIMARY KEY (IdDevice)
)

CREATE TABLE usernames (
    IdUsername INT NOT NULL,
    Username VARCHAR(20),
    Password VARCHAR(20),
    UserRole INT,
    UserScope INT,
    PRIMARY KEY (IdUsername)
)

Username 和 Password 字段用于为我们的服务器和数据库存储我们所有路由器、交换机和多个 root 用户的凭据。我的设计问题是:员工有登录我们公司域的凭据,设备也有凭据。但是设备和员工没有任何共同的字段,因此它们必须位于不同的表中。我如何将usernames 表关联到employees 和devices 考虑到:

  • 一名员工可能有多个用户名(具有不同的角色 和范围)。
  • 有些员工甚至在不同的范围(服务器、WordPress 等)使用相同的用户名。
  • 一个设备可能有也可能没有多个用户名 (具有不同的角色)。
  • 员工和设备的凭据共享相同的特征(字段),所以我真的不希望有两个不同的表来处理同一件事,但如果我找不到解决方案,我想我会选择这个。

数据库本身比较复杂;它涵盖了我们网络中所有用户和静态 IP 地址的完整资产清单和列表。

【问题讨论】:

    标签: mysql sql database-design


    【解决方案1】:

    选项 1:

    创建两个相似的表,EmployeeUsernames 和 DeviceUsernames:

    CREATE TABLE EmployeeUsernames (
        IdUsername INT NOT NULL,
        IdEmployee INT,
        PRIMARY KEY (IdUsername),
        FOREIGN KEY (IdEmployee) REFERENCES employees (IdEmployee),
        FOREIGN KEY (IdUsername) REFERENCES usernames (IdUsername)
    );
    
    CREATE TABLE DeviceUsernames (
        IdUsername INT NOT NULL,
        IdDevice INT,
        PRIMARY KEY (IdUsername),
        FOREIGN KEY (IdDevice) REFERENCES devices (IdDevice),
        FOREIGN KEY (IdUsername) REFERENCES usernames (IdUsername)
    );
    

    这允许没有用户名的情况以及您有多个用户名的情况。如果您愿意,您可以添加检查约束或触发器,以针对不同情况下的用户名数量强制执行任何特定规则。

    选项 2:

    您可以在用户名中添加两列 - IdEmployee 和 IdDevice。允许它们为空,然后使用检查约束或触发器确保在插入数据时填充一列或另一列,并且插入的值有效(即确保员工或设备存在)。

    选项 3:

    在用户名中添加两列 - UsernameOwner 和 UsernameOwnerType。将 IdEmployee 或 IdUsername 值放入第一列,并使用第二列指示该特定行链接到哪个表。如上所述,使用检查约束或触发器来确保数据保持有效。


    就个人而言,我会选择选项 1 - 它已标准化,对于其他人拿起数据库并试图了解它是如何挂在一起的不会那么奇怪,但有些人真的对其他选项之一发誓。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2017-12-17
      • 2016-06-23
      • 2018-09-03
      • 2011-01-11
      • 2016-04-14
      • 2020-09-16
      相关资源
      最近更新 更多