好的,这个问题是如此具体,我甚至不知道如何搜索一个类似的问题。我有一个包含多个表格和关系的数据库,但过去几天我一直遇到设计问题。我正在使用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)
)
Username
和Password
字段用于存储我们的服务器和数据库的所有路由器,交换机和多个root用户的凭据。我的设计问题是:员工拥有登录我们公司域的凭据,设备也有凭据。但是设备和员工没有任何共同的领域,所以他们必须在不同的表中。考虑到以下情况,我如何将usernames
表与employees
和devices
相关联:
这不是学校的家庭作业,这是我第三天试图弄清楚如何实施数据库的解决方案。如果我必须改变数据库中的几乎所有设计,我会。数据库本身比这更复杂,它涵盖了完整的资产库存以及我们网络中所有用户和静态IP地址的列表,因此这是订购所有混乱的一部分。
如果您可以建议我采用不同的方法解决我的问题,我愿意接受您的观点并尝试一下。我只是不想让这个项目陷入困境。
提前致谢。
答案 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>