3

PHPおよびMySQLとの多対多の関係を処理する方法のチュートリアルを読んでいます。

この質問では、次のルールを示す「データベーススキーマ」セクションを参照します。

この新しいテーブルは、次のことを可能にするように作成する必要があります。

* It must have a column which links back to table 'A'.
* It must have a column which links back to table 'B'.
* It must allow no more than one row to exist for any combination of rows from table 'A' and table 'B'.
* It must have a primary key.

これまでのところ、非常にクリアです。

私が抱えている唯一の問題は、3番目のルール(「どの組み合わせでも1行しか存在できないようにする必要がある」)にあります。
これも適用したいのですが、うまくいかないようです。

mysql(5.XX)のテストインスタンスでは、同じ関係を反映する2つの行を追加できます。

たとえば、(行を追加して)この関係を作成する場合:
AからB
この関係も作成できます:
BからA

したがって、質問は実際には2つの質問です。

1)上記を許可しない3番目のルールをどのように解釈しますか?組み合わせに関係なく、一意の関係は1つだけです。

2)「A」のすべての関係を検索したい場合、SQLクエリはどのようになりますか?

注1:基本的に、私の最終的な目標は「友情」システムを作成することです。私が理解している限り、解決策は多対多のテーブルです。可能であれば、別の方法を提案します。

注2: usersテーブルは、リレーション(友情と呼びます)テーブルとは別のデータベースにあります。したがって、外部キーを使用できません。

4

3 に答える 3

2

最初の質問の場合:

  1. 両方の列に一意の制約を作成します
  2. 常に列を並べ替えることを確認してください。したがって、テーブルに列がaあり、それが以下で bあることを確認してください。ab

2番目の質問の場合:

SELECT
  *
FROM
  many_to_many_table
WHERE
  a = A or b = A
于 2010-08-29T23:07:53.523 に答える
1

複合主キーが必要なようです。

CREATE TABLE relationship (
     A_id INTEGER UNSIGNED NOT NULL,
     B_id INTEGER UNSIGNED NOT NULL,
     PRIMARY KEY (A_id, B_id)
);

これは、テーブルを定義し、関連する行が1つだけになるようにテーブルを設定する方法AですB。これは、主キーがテーブル内で一意である必要があるために機能します。したがって、データベースでは、特定の値のペアを持つ1つの行のみが許可されます。主キーではない複合キーを作成でき、一意である必要はありません(ただし、複合であるかどうかに関係なく、一意の非主キーを作成できます)が、仕様で主キーが要求されたため、それが私です提案されました。

もちろん、この特定の関係に関する情報を格納するために他の列を追加することもできます。

于 2010-08-29T23:29:41.243 に答える
0

OK WoLpHの方が速かったので、基本的に同意します(両方の列に同時に単一の制約を作成する必要があることに注意してください!)。そして、あなたが言及したルールと衝突する理由を説明するために:通常、AとBは異なるテーブルです。したがって、n:m関係の一般的な例では、エントリ(1,0)と(0,1)が異なるペアを参照するため、これらのエントリが許可されます。テーブルA=テーブルBを持つことは別の状況です(ユーザーとしてAとBを使用しますが、例ではそれらはテーブルです)。

于 2010-08-29T23:20:32.323 に答える