0

小さな MYSQL データベースを構築していますが、現在、エンティティのホームに問題があります。その属性は ROOM_NUM と BUILD_CODE です。この 2 つは複合主キーを構成し、外部キー BUILD_CODE はそれが配置されている建物を参照します。

BUILD_CODE を単一の文字 ('a'、'b'、'c' など) にして、HOME の主キーを "A302" や "B205" のようなものにすることができるかどうか疑問に思っていました。 "。その主キーの最初の文字は BUILD_CODE を参照し、残りの数字は部屋番号です。次に、一意の単一値の主キーを取得します。私が尋ねる理由は、HOME を参照する PERSON テーブルに複数の外部キーを持つ必要がないようにするためです。

4

2 に答える 2

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)

ほら、残りのデータについて多くを語らない値をHOME持っていることは本当に問題ではありません.2つを結合するための手段としてそのフィールドを使用しているだけです.ID

もちろん、andフィールドをフィールドにINSERT連結することも同じくらい簡単にできます... それも問題ありません。ただし、(a) 文字列ルックアップは整数ルックアップよりも多くのリソースを使用し、(b) アプリケーションが維持する必要があるのはもう 1 つだけであることに注意してください (たとえば、部屋番号を A302 として計算することから始めたらどうなるでしょうか。しかし、より大きな部屋番号を確認した後で、A00302 に決定する場合は、テーブル全体 (およびそのすべての関連付け) を調べて、 を更新する必要があります。これはあまり理想的ではありません)。BUILD_CODEROOM_NUMIDID

于 2013-11-14T06:10:54.517 に答える