1

これは単純なLIMITクエリではないと思います。カテゴリ
を持つ主催者がいます。 各オーガナイザーは 3 つのカテゴリのみを持つことができます。 私の問題は、カテゴリを編集するページがあり、通常の INSERT を使用すると、3 つのカテゴリを超える可能性があることです。


  1. 一部のオーガナイザーは 2 つのカテゴリを持っていて、その後 3 つに更新することを選択する場合があります。
  2. 一部のオーガナイザーは 3 つのカテゴリを持ち、更新して 2 つにすることができます。
  3. オーガナイザーには少なくとも 1 つのカテゴリが必要です (これはクライアント側で処理されます)。

編集:現在実装されている 私の現在のソリューションは、変更されたカテゴリを挿入する前にすべてのカテゴリを削除し、クライアント側を使用して制限を 3 に制限することです。私はMySQLを使用しています。データベースは次のように正規化されます。

       organiser                                     organiser_categories
  +-------------------+                    +-------------------+--------------+
  |  organiser_email  |                    |  organiser_email  | category_id  |
  +-------------------+                    +-------------------+--------------+
  |  abc@gmail.com    |                    |   abc@gmail.com   |     1        |
  |  xyz@gmail.com    |                    |   abc@gmail.com   |     2        |
  +-------------------+                    +-------------------+--------------+


                             categories
                 +---------------+---------------+
                 |  category_id  | category_name |
                 +---------------+---------------+
                 |      1        |    Leisure    |
                 |      2        |    History    |
                 +---------------+---------------+
4

4 に答える 4

2

オプション1:

トリガーを介して制限を適用します。

長所/短所: これにより、データ モデルが一般的に保たれ、必要に応じて制限を簡単に変更できますが、追加のクエリ (つまり、行のカウント) が必要になります。

オプション 2:

ストアド プロシージャを介して更新を行い、そこで制限を適用します。

長所/短所: 上記と同様。

オプション 3:

モデルを再設計しますorganiser_categories。3 つの NULL 許容 FK フィールドを削除して追加しorganiser、最大 3 つのカテゴリを保存します。

長所/短所: これにより、追加のパフォーマンス ペナルティなしで制限への準拠が保証されますが、クエリ ロジックの変更が必要であり、事後の進化は比較的困難です。また、必要以上の情報が含まれています: カテゴリの「位置」(これらの 3 つのフィールドのどれがそれを表しているかに基づく)。

于 2012-07-03T09:07:17.657 に答える
2

mysql の代わりにアプリ サイトでチェック (3 つのカテゴリに制限) を行うことができると思います。それはデータの検証の一部です。

データベースに更新するとき、すべてのカテゴリを削除してカテゴリを挿入することに同意します。

于 2012-07-03T08:50:56.213 に答える
1

そのオーガナイザーのカテゴリーの総数が 3 つを超える場合に、新しいレコードを拒否するトリガーを定義できます。BEFORE INSERTorganiser_categories

CREATE TRIGGER limit_organiser_categories BEFORE INSERT ON organiser_categories
FOR EACH ROW
  IF (
    SELECT COUNT(DISTINCT category_id)  -- prefer COUNT(*) if appropriate
    FROM   organiser_categories
    WHERE  organiser_email = NEW.organiser_email
  ) = 3 THEN
    CALL too_many_categories;           -- call a non-existant procedure
  END IF;

これによりデータベースでの制限が強制されますが、ユーザーに意味のあるフィードバックを提供するために、クライアント側で同様のチェックを実行することをお勧めします。

于 2012-07-03T09:07:03.457 に答える
1

クライアント側で選択制限 3 でユーザーを制限することをお勧めします。これは、オーガナイザーのそれぞれのデータを削除して再挿入するためのより良い方法です。

delete from organiser_categories where organizer_email='abc@xyz.com';
insert into organiser_categories (organiser,category) 
values ('abc@xyz.com',1), ('abc@xyz.com',3);
于 2012-07-03T08:53:12.950 に答える