3

USER は PERSON で、PERSON には COMPANY があります - user -> person は 1 対 1、person -> company は多対 1 です。

person_id は USER テーブルの FK です。company_id は PERSON テーブルの FK です。

PERSON は USER ではないかもしれませんが、USER は常に PERSON です。

company_id が user テーブルにある場合、username と company_id に基づいて一意のキーを作成できますが、そうではなく、データの複製になります。

現在、RoseDB マネージャー ラッパー コードで一意のユーザー名/会社 ID ルールを実装していますが、それは間違っているように感じます。可能であれば、DB レベルで独自のルールを定義したいのですが、どのようにアプローチすればよいかわかりません。私はこのようなことを試しました:

alter table user add unique(used_id,person.company_id);

しかし、それはうまくいきません。

ドキュメントを読んでも、少しでも似たようなことをする例が見つかりません。存在しない機能を追加しようとしていますか、それとも何か不足していますか?

4

3 に答える 3

1

まあ、あなたが望むことをする単純なものは何もありません. BEFORE INSERTただし、 and BEFORE UPDATE triggersを使用して、必要な制約を強制することはおそらく可能です。トリガーを失敗させる処理方法については、MySQL エラーの発生に関するこの SO の質問を参照してください。

于 2009-09-20T21:55:42.013 に答える
1

テーブルでUNIQUE制約を定義できます。Person

CREATE TABLE Company (
 company_id SERIAL PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE Person (
 person_id SERIAL PRIMARY KEY,
 company_id BIGINT UNSIGNED,
 UNIQUE KEY (person_id, company_id),
 FOREIGN KEY (company_id) REFERENCES Company (company_id)
) ENGINE=InnoDB;

CREATE TABLE User (
 person_id BIGINT UNSIGNED PRIMARY KEY,
 FOREIGN KEY (person_id) REFERENCES Person (person_id)
) ENGINE=InnoDB;

Personしかし、実際には、テーブル内でも一意の制約は必要ありません。これperson_idは、それ自体で既に一意であるためです。与えられたperson_id2 つの会社を参照する方法はありません。

したがって、どの問題を解決しようとしているのかわかりません。


あなたのコメントについて:

これでは、同じユーザー名が異なる会社に存在することを許可するという問題は解決しません。

特定のユーザー名を 1 つの会社内で一意にし、別の会社で使用できるようにしたいですか? それはあなたの最初の質問から私には明確ではありませんでした。

したがって、ユーザー固有の属性が他にあまりない場合は、User と Person を組み合わせて " is_user" 列を追加します。または、null 以外のクリプトパスを持つ Person が定義上 User であることが暗黙的に true であることに依存するだけです。

その後、テーブル間のUNIQUE制約に関する問題は解消されます。

于 2009-09-20T22:54:47.060 に答える
1

テーブルにさらに属性がありますPERSONか? 私が尋ねる理由は、あなたが実装したいのは典型的な結果表です:

USERSテーブル:

  • ユーザー ID (pk)

USER_COMPANY_XREF(旧姓) テーブル:

  • user_id (pk、fk)
  • company_id (pk、fk)
  • EFFECTIVE_DATE (非ヌル)
  • EXPIRY_DATE (非ヌル)

COMPANIESテーブル:

  • company_id (pk)

テーブルの主キーはとUSER_COMPANY_XREFの複合キーでUSERS.user_idありCOMPANIES.company_id、テーブル内のデータを複製せずにユーザーを複数の会社に関連付けることができ、USERS参照整合性を提供します。

于 2009-09-20T22:55:05.980 に答える