私はMySQL DBに3つのテーブルを持っています。 これは、組織関連のものがあるメインテーブルです。すべての組織には、一意の識別子があります。これは、一部の表の外部キーです。外部キーの可能な値をどのように区切ることができますか?
org
+------------+-------------+
| org_id | name |
+------------+-------------+
| 1 | a |
| 2 | b |
| 3 | c |
+------------+-------------+
これはグループテーブルです。組織は多くのグループを持つことができます。
groups
FOREIGN KEY (ORG_ID) REFERENCES ORG (ID);
+------------+-------------+----------+
| ID | org_id | name |
+------------+-------------+ ---------+
| 1 | 1 | Group1 |
| 2 | 2 | Group2 |
| 3 | 2 | Group3 |
+------------+-------------+----------+
これは更新を行いたいフィードテーブルです。 フィードに関連付けられているグループは1つのみです。
feed
FOREIGN KEY (GROUP_ID) REFERENCES GROUPS (ID);
+------------+-------------+--------------+
| ID | org_id | group_id |
+------------+-------------+ -------------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 1 | NULL |
| 4 | 2 | 3 |
+------------+-------------+--------------+
だから私は解決できない1つの問題があります。私がINSERT
またはUPDATE
行になったとき、groups_id
を設定しましたが、組織に属していないgroups_id
でもかまいません。 GROUPSのすべてのIDが有効なFK値であるため、これが発生します。それは私が避けたいものです。 insert
またはupdate
のgroups_id
の行がと同じorg_id
であることだけが可能である必要があります。
ご覧のとおり、データは正常です。しかし、私がこれを作ろうとすると、エラーが発生したことをうれしく思っています。INSERT INTO feed VALUES (4, 2, 1)
ええ、そうです、私は素敵なエラーがありません....
私はそれらの間を接続することは困難です。私が欠けている情報や方法があるようです。私はたくさん探してきましたが、私は自分の問題を説明する言葉を知らない。
私はあなたに質問しますか?
EDIT:
すべてのフィードと、すべてのグループが識別子を持つ組織に関連しています。組織はフィード/メッセージを作成できます。このフィードがグループに関連付けられていない場合、このフィードは公開されません。特別なフィードの場合、グループを作成できます。このグループはこの特別な組織に関連しています。
これは動作し、すべてが良いです:
UPDATE feed
SET title = "Title", message = "Message", groups_id = "1"
WHERE id = "1" AND org_id = "1"
しかし、これも動作します:
UPDATE feed
SET title = "Title", message = "Message", groups_id = "2"
WHERE id = "1" AND org_id = "1"
問題は、関連しているフィード(にグループを関連付けることが可能であること、ですorg 1)、グループはorgに関連付けられていません(グループ2はorg 2に関連付けられています)。
だから、私の考えは、外部キーまたは類似(チェック、結合、サブクエリ)を介してこれを解決する方法があります。または、私のdbデザインについて考えるべきですか?
あなたの間違いは、最初に 'feed'に' org_id'を含んでいます。これは、 'group_id'によって' groups'テーブルから導かれるべきです。 – shmosel
なぜ、orgにはidとorg_idの両方が必要ですか? – e4c5
@shmosel物事は、feedsを関連付けるためにFEEDのorg_idが必要です。groups_idは指定されていません。グループにリンクされていないすべての行は、NULLであり、パブリック・グループに自動的に入ります。しかし、与えられたorg_idだけに。 – Keev