0

顧客がサプライヤーから製品を注文できるマーケットプレイスを設計しています。データベース スキームを定義する際に助けが必要です。

顧客とサプライヤーの 2 種類の会社があります。サプライヤーは独自の顧客を持つことができます (そして、1 つの顧客が多くのサプライヤーに属することができます)。顧客とサプライヤーの両方が独自の従業員を持つことができます。マネージャーとアシスタントは、アプリケーションにログインし、ユーザーの役割に基づいてテーブルにアクセスでき、所属する会社のレコードのみにアクセスできます。

アプリケーションに登録する場合、ユーザーは登録フォームでユーザー タイプ (顧客またはサプライヤー) を選択する必要があります。登録後、ユーザーは自動的に「管理者」の役割を取得します。その後、マネージャーとして会社情報と従業員を追加できます。システムに会社情報と従業員を追加できるのはマネージャーのみです。

顧客とサプライヤーは異なる会社属性を持つことができるため、2 つのテーブルに分けました。

  1. このシナリオのために以下のスキーマを作成しましたが、これが正しい方法かどうかはわかりません。より良い解決策は何ですか?

  2. このシナリオは別の問題を引き起こします: マネージャーが登録すると、マネージャーは Employee テーブルに追加されますが、この時点では、会社情報を追加していないため、まだどの会社にも属しておらず、customer_id または supply_id がありません。従業員テーブル。会社情報を追加する場合にのみ、新しい会社の顧客 ID またはサプライヤー ID (会社 ID) を取得します。ただし、従業員を会社に関連付けるためには、この会社 ID を従業員テーブルのマネージャーのレコードに追加し直す必要があります。これはどうあるべきかではないと思いますが、より良い解決策を思い付くことはできません。Customers テーブルと Suppliers テーブルの両方で「employee_id」を使用してこの問題を解決しようとしています。このように、マネージャーが会社情報を追加すると、彼らの「employee_id」会社情報と共に Customers または Suppliers テーブルに保存されます。このようにして、マネージャーは会社と 1 対 1 で関連付けられます。つまり、マネージャーは、自分が所有する 1 つの会社にのみアクセスできます。後でマネージャーが従業員を会社に追加するとき、会社が既に存在するため、サプライヤーまたは顧客 ID が従業員レコードと共に保存されるため、簡単になります。

これを正しい方法で行う方法は?

表:

従業員:

  • ID
  • customer_id NULL (顧客の FK)
  • Supplier_id NULL (サプライヤーの FK)
  • fname
  • 名前
  • Eメール
  • パスワード
  • user_type (顧客またはサプライヤー)
  • 役割 (マネージャーまたはアシスタント)

顧客:

  • ID
  • employee_id (Employees の FK)
  • 会社名
  • 連絡先

サプライヤー:

  • ID
  • employee_id (Employees の FK)
  • 会社名
  • 連絡先

ありがとうございました

4

1 に答える 1

4

このようにしないでください。後悔します。パーティ モデルとテーブル継承を使用します。

Frank は Acme Inc. の組織担当者である、または Jim は BizCo の従業員であるなど、当事者間に関係があります。

まだビジネスを行っていない見込み客やサプライヤーなど、関係を持っていない可能性のある人のために、宣言された役割を使用することもできます。

このスキーマは、次の理由で有利です。

  • 個人または組織に (販売注文を介して) 販売することができます (1 つの外部キーを使用)。
  • パーティーは複数の役割を果たしたり、同時に複数の関係を持つことができます
  • 重複なし

ここでは単一テーブルの継承を使用していますが、null が気に入らない場合はクラス テーブルの継承を使用できます。ここでは PostgreSQL スタイルの SQL を使用していますが、MySQL に合わせて簡単に調整できます。

create table party_type (
  id int primary key,
  description text not null unique
);

insert into party_type values
(1, 'Individual'),
(2, 'Organization');


create table party (
  id serial primary key,
  type int not null references party_type(id),
  organization_name text null,
  first_name text null,
  last_name text null
);



create table party_relationship_type (
  id int primary key,
  description text not null unique
);

insert into party_relationship_type values 
(1, 'Organization Contact'),
(2, 'Employment');


create table party_relationship (
  from_party_id int not null references party(id),
  to_party_id int not null references party(id),
  type int not null references party_relationship_type(id),
  primary key (from_party_id, to_party_id, type),
  check (from_party_id <> to_party_id)
);

/* note: no check constraints in mysql, you will have to use a trigger, or use Postgres. Don't need roles, but can be handy */

create table party_role_type (
  id int primary key,
  description text not null unique
);

insert into party_role_type values 
(1, 'Customer'),
(2, 'Supplier');


create table party_role (
  party_id int not null references party(id),
  party_role_type_id int not null references party_role_type(id),
  primary key (party_id, party_role_type)
);
于 2013-06-06T19:40:06.573 に答える