【发布时间】:2019-01-28 22:05:05
【问题描述】:
我目前正在从事建筑管理软件工作,在为我的数据库设计架构时遇到了一个问题(如下所述),目前我的数据库包含四个表,即 employee、地址、用户和许可证。
造成混淆的表格是employee和address; 下面提供的代码。
为了维护我的数据的Physical integrity,我没有存储任何从address词法派生的东西,例如Address1、Address2、City、State、County表员工中的等;因为我主观地认为,将不能唯一标识特定员工的属性作为另一个表的一部分会更好。现在我的问题出现了:
- GUID 作为 address 表的主键是不是一个不错的选择?
- 如果是,是否有可能是阻碍快速查询的因素?
我选择使用 GUID 作为 PK 索引的原因是我别无选择。 EmployeeId 来自 address 并没有为我提供解决方案,因为我不能拥有一个 PK 和 FK 的字段:see this。 p>
CREATE TABLE employee(
employeeId INT
NOT NULL
CHECK(employeeId > 0),
firstname VARCHAR(20)
NOT NULL,
lastname VARCHAR(20)
NOT NULL,
sex VARCHAR(1)
NOT NULL,
birthdate DATE
NOT NULL,
addressId VARCHAR(30),
PRIMARY KEY(employeeId)
);
CREATE TABLE address(
addressId VARCHAR(30)
NOT NULL,
employeeId INT,
Address1 VARCHAR(120)
NOT NULL,
Address2 VARCHAR(120),
Address3 VARCHAR(120),
City VARCHAR(100)
NOT NULL,
State CHAR(2)
NOT NULL,
Country CHAR(2)
NOT NULL,
PostalCode VARCHAR(16)
NOT NULL,
PRIMARY KEY(addressId),
FOREIGN KEY(employeeId) REFERENCES employee(employeeId) ON DELETE SET NULL
);
ALTER TABLE employee
ADD FOREIGN KEY(addressId)
REFERENCES address(addressId)
ON DELETE SET NULL;
我很想知道是否有任何其他方法可以在不使用 GUID 的情况下在 employee 和 address 之间建立适当的关系。另一种方法是指定 (int) 值,但在这种情况下,缺点是:
- 错误地引入了 FK != PK,这将导致表之间的关系不佳。
编辑:
你们中的一些人在 cmets 中建议将“UUID”索引更改为 AUTO_INCREMENT,但是当我必须从我的 WPF 应用程序中插入员工时,就会出现问题。
address中的PK addressId会不断增加。那么我应该将什么传递给 FK 以保持关系紧密和正确?
我是否应该创建一个 int 类型的变量,比如说 var i = 0 并且每次我插入一名员工时 -> 将该变量加一 -> 将其分配给 FK 还是? p>
【问题讨论】:
-
顺便说一句,varchar(1) 似乎是个愚蠢的想法
-
你感觉如何添加一个表格来放置员工和地址之间的关系? f.e.带有 2 个 FK:(Id、employeeId、AddressId)。这样地址表就可以简化了。
-
您的员工表和地址表都有自己的主键。然后,您的地址表将有一个外键,其中包含相关员工记录的主键。有什么问题?
-
嗯,1 中没有太多的 'var',是吗?
-
在这种情况下 Char 对我来说似乎更明智
标签: mysql database relationship