0

我正在构建一个小型 MYSQL 数据库,目前我的实体 HOME 存在问题。它的属性是 ROOM_NUM 和 BUILD_CODE。两者组成一个复合主键,外键 BUILD_CODE 引用它所在的建筑物。

我想知道是否可以让 BUILD_CODE 成为单个字符('a'、'b'、'c' 等),然后让 HOME 的主键类似于“A302”或“B205” ”。该主键的第一个字符将引用 BUILD_CODE,其余数字是房间号。然后我会有一个唯一的单值主键。我问的原因是我不必在我的 PERSON 表中有多个外键来引用 HOME。

4

2 回答 2

0

您可以使用代理键(序列)作为实体 HOME 的主键,并将其用作 PERSON 的外键。然后为BUILD_CODE 和ROOM_NUM 声明一个唯一键来保持组合的唯一性。

于 2013-11-14T06:05:10.683 回答
0

听起来 HOME 需要自己的单独标识符。ID 是什么并不重要……只要它是唯一的。

考虑以下:

mysql> CREATE TABLE HOME (ID INTEGER NOT NULL auto_increment, ROOM_NUM INTEGER, BUILD_CODE VARCHAR(1), PRIMARY KEY(ID));
Query OK, 0 rows affected (0.14 sec)

mysql> CREATE TABLE PERSON(ID INTEGER NOT NULL auto_increment, NAME VARCHAR(255), HOME_ID INTEGER, PRIMARY KEY(ID), FOREIGN KEY(HOME_ID) REFERENCES HOME(ID));
Query OK, 0 rows affected (0.14 sec)

mysql> INSERT INTO HOME (ROOM_NUM, BUILD_CODE) VALUES (302, "A"), (205, "B");
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM HOME;
+----+----------+------------+
| ID | ROOM_NUM | BUILD_CODE |
+----+----------+------------+
|  1 |      302 | A          |
|  2 |      205 | B          |
+----+----------+------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO PERSON (NAME, HOME_ID) VALUES ("someone", 1);
Query OK, 1 row affected (0.05 sec)

mysql> SELECT * FROM PERSON;
+----+---------+---------+
| ID | NAME    | HOME_ID |
+----+---------+---------+
|  1 | someone |       1 |
+----+---------+---------+
1 row in set (0.00 sec)

mysql> SELECT PERSON.NAME, HOME.BUILD_CODE, HOME.ROOM_NUM FROM HOME JOIN PERSON ON PERSON.HOME_ID = HOME.ID;
+---------+------------+----------+
| NAME    | BUILD_CODE | ROOM_NUM |
+---------+------------+----------+
| someone | A          |      302 |
+---------+------------+----------+
1 row in set (0.00 sec)

你看,它HOMEID值对其余数据的影响并不大……你只是将该字段用作将两者结合在一起的工具

当然,您也可以轻松地INSERTBUILD_CODEandROOM_NUM字段连接到ID字段中......这也很好。但请记住,(a)字符串查找比整数查找使用更多的资源,并且(b)这只是您的应用程序需要维护的另一件事(例如:如果您从将房间号计算为 A302 开始会发生什么,但是在看到更大的房间号之后,您决定选择 A00302?您必须遍历整个表——以及它的所有关联——并更新ID. 这不是非常理想)。

于 2013-11-14T06:10:54.517 回答