0

私の問題では、「Person」データベースに2つの列があります。1つの列には、その人が属するグループが格納され、1つの列には、その人がグループの管理者であることが格納されます。一度グループは1人の管理者しか持つことができません。

私の考えは、両方の列に独自の制約を設定する必要があるということです。しかし、問題は、管理者ではない他のユーザーにとって、独自の制約が破られることです。

彼の問題の適切な解決策は何であるべきか。

サンプルデータベース

----------------------------------
Person_id | Group_Id  |  Is_admin
----------------------------------
1         | 9         | null
2         | 9         | null
3         | 9         | null
4         | 9         | 1
5         | 9         | null
6         | 4         | null
7         | 4         | null
8         | 4         | null
9         | 4         | 1

ここで、Group_IdとIs_adminに一意の制約を適用すると、それらは一意になりますが、その人が管理者でない場合はそうではありません。

4

2 に答える 2

2

グループに関する情報を含む新しいテーブルを作成することを検討してください。group_idプライマリ インデックスとそのような列は、テーブルを外部キーとしてadmin_id参照します。personこうすることで、列を完全に排除しis_admin、よりリレーショナルな設計を行うことができます。

于 2013-01-13T17:45:35.033 に答える
1

それは私にとってはうまくいきます...

DROP TABLE IF EXISTS person_group;

CREATE TABLE person_group
(Person_id INT NOT NULL PRIMARY KEY
,Group_Id  INT NOT NULL
,Is_admin TINYINT NULL
,UNIQUE (group_id,is_admin)
);

INSERT INTO person_group VALUES
(1         , 9         , null),
(2         , 9         , null),
(3         , 9         , null),
(4         , 9         , 1),
(5         , 9         , null),
(6         , 4         , null),
(7         , 4         , null),
(8         , 4         , null),
(9         , 4         , 1);

SELECT * FROM person_group;
+-----------+----------+----------+
| Person_id | Group_Id | Is_admin |
+-----------+----------+----------+
|         6 |        4 |     NULL |
|         7 |        4 |     NULL |
|         8 |        4 |     NULL |
|         9 |        4 |        1 |
|         1 |        9 |     NULL |
|         2 |        9 |     NULL |
|         3 |        9 |     NULL |
|         5 |        9 |     NULL |
|         4 |        9 |        1 |
+-----------+----------+----------+

INSERT INTO person_group VALUES (10, 9, null);
Query OK, 1 row affected (0.00 sec)

INSERT INTO person_group VALUES (11, 9, null);
Query OK, 1 row affected (0.00 sec)
于 2013-01-13T17:41:38.803 に答える