1

ここに私の問題があります: (MySQL を使用)

「ショップ」と「クライアント」という 2 つのエンティティがあります。また、'clients' と 'shops' の間に 'clients_shops' (CakePHP 命名規則) と呼ばれる M:M テーブルがあります。私がこのようにしている理由は、これが「クライアント」が多くの「ショップ」を持つ可能性があり、「ショップ」が間違いなく多くの「クライアント」を持つ SaaS アプリケーションであるためです。

ただし、実際に必要なのは、「ショップ」が自分のレコードからではなく、自分のレコードからその「クライアント」を編集/削除することであるため、ショップに「クライアント」レコードを更新/削除する機能を与えたくありません。 「clients」によって管理されるマスター「clients」テーブル。

とにかく、この構造を使用すると、「ショップ」は「clients_shops」テーブルでクエリを実行してクライアントのリストを取得でき、「クライアント」はクエリを実行して「ショップ」のリストを取得できます。これまでのところ良い...

これまでのところ、データベースは次のようになっています。

table.clients
client_id (PK, AI, NN)

table.shops  
shop_id (PK, AI, NN)

table.clients_shops  
clients_shops_id (PK,AI,NN)  
client_id (FK)  
shop_id (FK)

ORM は次のようになります。

shops hasMany clients_shops  
clients hasMany clients_shops

これまでのところは順調です(私は思う...)が、ここで私の質問です。「trips」という名前の 3 番目のテーブルがあるとします。「トリップ」テーブルには、「店」が提供する「旅行」を「顧客」が予約する個々の予約に関する情報が格納されます。これは私の脳がどろどろになっているところです。この関係をどのように設定すればよいですか?

この方法ですか:

table.trips
trips_id (PK,AI,NN)
clients_shops_id (FK) [which would contain keys for both the shop and the client]

clients.client_idまたは、 ANDを使用する別のテーブルのように、これを行うためのより良い方法がありますclients_shops.clients_shops_id

このすべてを実際に読んでくれた人に、前もって感謝します!

4

3 に答える 3

1

によって必要とされない限りORM、クライアント/ショップおよびそれを参照するすべてのものに代理外部キーは必要ありません。

代わりにコンポジットPRIMARY KEYを作成し、他の場所から参照します。

CREATE TABLE clients_shops
        (
        client_id INT NOT NULL,
        shop_id INT NOT NULL,
        PRIMARY KEY (client_id, shop_id)
        );

CREATE TABLE trips
        (
        trip_id INT NOT NULL PRIMARY KEY,
        client_id INT NOT NULL,
        shop_id INT NOT NULL,
        trip_data …,
        CONSTRAINT fk_trips_clients_shops
                FOREIGN KEY (client_id, shop_id)
                REFERENCES clients_shops
        );

このモデルは、クライアントとショップの関係をクライアントのトランザクションとは別に維持し、「関連」していない限り、クライアントがショップから購入できないようにすることを前提としています。

おそらく、顧客がショップから旅行を注文するたびに、関係が自動的に表示されるようにする必要があります。この場合、必要なのは 2 番目のテーブルだけで、最初のテーブルは単なるテーブルです。

SELECT  DISTINCT client_id, shop_id
FROM    trips
于 2011-03-18T19:08:22.277 に答える
1

これは、探しているものを処理するための論理図です。要件に応じて、非識別関係 (Client::Trip & Shop::Trip) を識別関係に変更できます。もしそうなら、Shop::Trip を識別に変更するだけに制限します。また、必要に応じてカーディナリティを変更します。

ここに画像の説明を入力

于 2011-03-19T02:06:04.420 に答える
0

おそらく次のように trips テーブルを作成します。

table.trips
trip_id (PK)
shop_id (FK to shops)
client_id (FK to clients)
other_trip_column_etc

trips テーブルから mm テーブル client_shops を参照するのではなく、個別の外部キーを使用して shop テーブルと client テーブルを参照するだけです。

client_shops テーブルは、クライアントとショップの間の現在の関係を表します。旅行はこれらの関係に依存するべきではありません。将来的に変更される可能性があり、おそらく旅行のデータが時間の経過とともに変更されることは望ましくないからです。これは、どの店、顧客、旅行がどのようなものであったかを正確に特定するトランザクション レコードである必要があります。クライアントとショップの現在の関係に関係なく、その時点でスケジュールされます。

于 2011-03-18T19:11:06.910 に答える