在这种情况下,GUID是地址的良好参考键吗?

时间:2019-01-28 22:05:05

标签: mysql database relationship

我目前正在使用建筑管理软件,现在为包含四个表的数据库设计模式时遇到了问题(如下所述),即 employee < / strong>,地址用户许可

造成混乱的表是员工地址下面提供的代码

为了维护数据的 Physical integrity ,我没有存储从 address 词汇导出的任何内容,例如Address1,Address2,City,State ,表等县的员工;因为我主观地认为,最好不要使用唯一标识特定雇员的属性来构成另一个表的一部分。现在我的问题出现了:

  • 使用 GUID 作为地址表的主键是一个不错的选择吗?
  • 如果是,是否有可能是阻止快速查询的因素?

之所以选择使用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)值,但是在那种情况下,缺点是:

  • 错误地引入了FK!= PK,这将导致表之间的关系不佳。

编辑:

一些人在注释中建议将“ UUID”索引更改为AUTO_INCREMENT,但是当我不得不从WPF应用程序中插入员工时,对我来说就会出现问题。

地址中的PK addressId 会不断增加。然后我应该把什么传递给FK,以保持这种关系的正确性和正确性?

我应该创建一个int类型的变量,比如说 var i = 0 ,并且每次我插入一名雇员时->将该变量加一->将其分配给FK还是?

1 个答案:

答案 0 :(得分:2)

您需要这样的东西,以便在员工和地址之间进行多对多关联(地址类型将类似于住所,工作,账单,旅行等)。然后,您可以创建其他实体表来跟踪这些实体与地址之间的关联。在表employee_address中,这些列将是返回其相对表的外键。

对于将GUIDINT用作主键,数字值的读取速度比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