我目前正在使用建筑管理软件,现在为包含四个表的数据库设计模式时遇到了问题(如下所述),即 employee < / strong>,地址,用户和许可。
造成混乱的表是员工和地址; 下面提供的代码。
为了维护数据的 Physical integrity ,我没有存储从 address 词汇导出的任何内容,例如Address1,Address2,City,State ,表等县的员工;因为我主观地认为,最好不要使用唯一标识特定雇员的属性来构成另一个表的一部分。现在我的问题出现了:
之所以选择使用GUID作为PK索引,是因为我别无选择。 地址中的 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的情况下在雇员和地址之间建立适当的关系。另一种方法是指定(int)值,但是在那种情况下,缺点是:
编辑:
一些人在注释中建议将“ UUID”索引更改为AUTO_INCREMENT,但是当我不得不从WPF应用程序中插入员工时,对我来说就会出现问题。
地址中的PK addressId 会不断增加。然后我应该把什么传递给FK,以保持这种关系的正确性和正确性?
我应该创建一个int类型的变量,比如说 var i = 0 ,并且每次我插入一名雇员时->将该变量加一->将其分配给FK还是?>
答案 0 :(得分:2)
您需要这样的东西,以便在员工和地址之间进行多对多关联(地址类型将类似于住所,工作,账单,旅行等)。然后,您可以创建其他实体表来跟踪这些实体与地址之间的关联。在表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