数据库设计,设备和员工用户表

时间:2015-04-24 14:25:53

标签: database-design passwords username

好的,这个问题是如此具体,我甚至不知道如何搜索一个类似的问题。我有一个包含多个表格和关系的数据库,但过去几天我一直遇到设计问题。我正在使用Microsoft Access,但我们的想法是使用MySQL迁移到我们的Linux服务器,无论如何,问题不是与DBMS相关,而是设计问题。

我有一个设备表(或任何具有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)
)

UsernamePassword字段用于存储我们的服务器和数据库的所有路由器,交换机和多个root用户的凭据。我的设计问题是:员工拥有登录我们公司域的凭据,设备也有凭据。但是设备和员工没有任何共同的领域,所以他们必须在不同的表中。考虑到以下情况,我如何将usernames表与employeesdevices相关联:

  • 一名员工可能拥有多个用户名(具有不同的角色) 和范围)。
  • 有些员工甚至拥有不同范围的相同用户名(服务器,Wordpress等)。
  • 一个设备可能有也可能没有多个用户名 (有不同的角色)。
  • 员工和设备的凭据共享相同的特征(字段),因此我真的不希望为同一个事物设置两个不同的表。但如果我找不到解决方案,我想我会接受这个。

这不是学校的家庭作业,这是我第三天试图弄清楚如何实施数据库的解决方案。如果我必须改变数据库中的几乎所有设计,我会。数据库本身比这更复杂,它涵盖了完整的资产库存以及我们网络中所有用户和静态IP地址的列表,因此这是订购所有混乱的一部分。

如果您可以建议我采用不同的方法解决我的问题,我愿意接受您的观点并尝试一下。我只是不想让这个项目陷入困境。

提前致谢。

1 个答案:

答案 0 :(得分:0)

选项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。允许它们为null,然后使用检查约束或触发器确保在插入数据时填充一列或另一列,并且插入的值有效(即确保员工或设备存在)。

选项3:

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

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