- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前在一家建筑管理软件公司工作,在为包含四个表的数据库设计架构时遇到了一个问题(如下所述),目前,即员工、地址、用户和许可证。
造成混淆的表是employee 和address; 下面提供的代码。
为了维护 Physical integrity 在我的数据中,我没有在表 employee 中存储从 address 词法派生的任何内容,例如 Address1、Address2、City、State、County 等;因为我主观上认为,对于不能唯一标识特定员工的属性,将其作为另一个表的一部分会更好。现在我的问题出现了:
我选择使用 GUID 作为 PK 索引的原因是我别无选择。来自 address 的 EmployeeId 没有给我提供解决方案,因为我不能有一个字段既是 PK 又是 FK: see this .
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) 值,但在这种情况下,缺点是:
编辑:
你们中的一些人在评论中建议将“UUID”索引更改为 AUTO_INCREMENT,但当我必须从我的 WPF 应用程序中插入员工时,问题就出现了。
来自 address 的 PK addressId 会自行增加。然后我应该将什么传递到 FK 中以保持关系紧密和正确?
我是否应该创建一个 int 类型的变量,比方说 var i = 0 并且每次我插入一名员工 -> 将该变量增加 1 -> 将其分配给 FK 或?
最佳答案
为了在员工和地址之间建立多对多关联(地址类型包括家庭、工作、账单、旅行等),您需要这样的东西。然后,您还可以创建其他实体表来跟踪这些实体和地址之间的关联。在表 employee_address
中,这些列将作为外键返回到它们的相关表。
至于使用 GUID
与 INT
作为主键,在 JOIN
上数值读取速度比字符串值快。根据数据量的大小,您可能需要在未来几年内从 INT
切换到 BIGINT
。
另外,给这些人一些空间来输入他们的名字。 20 个字符太短了,尤其是姓氏。
employee
--------
employee_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(255) NOT NULL,
lastname VARCAHR(255) NOT NULL,
gender BIT NOT NULL,
birthdate DATE NOT NULL
address
---------
address_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
address1 VARCHAR(255),
address2 VARCHAR(255),
address3 VARCHAR(255),
city VARCHAR(255),
state CHAR(2),
country CHAR(2)
address_type
--------------
address_type_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
address_type VARCHAR(255)
employee_address
-----------------
employee_address_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
employee_id INT,
address_id INT,
address_type_id INT
关于mysql - 在这种情况下,GUID 是地址的良好引用键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410975/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!