6

プロジェクトのデータ モデルを設計したいのですが、「顧客」セクションに問題があります。これは、自然人と法人の 2 種類の顧客がいるためです。これが最善の方法です。

方法 1 : 次のように 3 つのテーブルを作成するには:

    Customers:
    ID int not null (PK)
    CustomerType bit not null
    NaturalPersonID int (FK)
    LegalPersonID int (FK)

    NaturalPeople:
    ID int not null (PK)
    FirstName nvarchar(50) not null
    LastName nvarchar(50) not null
    NationalSecurityNumber char(10) not null
    ...

    LegalEntities:
    ID int not null (PK)
    CompanyName nvarchar(100) not null
    RegistrationNumber char(20) not null
    ...

NaturalPersonID または LegalPersonID のいずれかが入力され、もう一方は null で、CustomerType は顧客のタイプ (Natural または Legal) を示します。

方法 2 : すべてのフィールドを含む 1 つのテーブルを作成するには:

    ID int not null (PK)
    CustomerType bit not null
    FirstName nvarchar(50)
    LastName nvarchar(50)
    NationalSecurityNumber char(10)
    CompanyName nvarchar(100)
    RegistrationNumber char(20)
    ...

顧客ごとに、いくつかのフィールドが入力され、他のフィールドは null です

方法 3 : いくつかのフィールドを持つ 1 つのテーブルを作成するには:

    ID int not null (PK)
    CustomerType bit not null
    FirstName nvarchar(50)
    LastName nvarchar(100)
    NationalSecurityNumber varchar(20)
    ...

自然な顧客のためにどのフィールドが自然に満たされているか。しかし、顧客が法務の場合は、論理的にデータを配置します。たとえば、LastName フィールドの CompanyName と NationalSecurityNumber フィールドの RegistrationCode および FirstName フィールドは null です。

方法 4 : 私が思いつかなかった、あなたが提案できる他の方法

PS私はMS SQL Server 2012でデータベースを実装しています

4

5 に答える 5

7

どのアプローチにも長所と短所があり、アプリケーションの要件と分析に基づいて適用できます。
ところでMethod 1、いくつかの考慮事項を使用することを好みます。

  1. Customertable は と のベース テーブルにNaturalPeopleなり LegalEntities、Customer の主キーは他の 2 つの主キーになります。
  2. 顧客テーブルには以下が含まれます: 顧客
    番号、顧客タイプなど、他の 2 つの共有情報。

  3. 次のような 2 つの異なるビジネス値に対してフィールドを使用することは避けてください。

    The fields are filled for the natural customers naturally. 
    But if the customer is a Legal one, we put data logically. For example 
    CompanyName in the LastName field and RegistrationCode in
    the NationalSecurityNumber field and the FirstName field is null.
    

    遅かれ早かれ、フィールドを分離しないと、最初の正規形に違反するため( National_Security_Number が NaturalPeople の必須値であり、 RegistrationCode が LegalEntities のオプション値であると考えてください)、苦しむことになります。フィールドに一意のキーまたは必須チェックを設定することはできません。

  4. 他のエンティティ (アカウント、サイン、住所など) は、Customer テーブルのみを参照します。

  5. Customer テーブルに単純な検索を実装し、法的および自然顧客の高度な検索を実装する必要があります。
于 2013-06-25T10:56:38.813 に答える
1

このシナリオでは、通常Customer、PK と識別子の列を持つ1 つのテーブルCustomerTypeと、Natural 用と Legal 用の 2 つの詳細テーブルを作成しますが、これらの追加テーブルの主キーはCustomersテーブルの PK と同じです (方法と同様) 1 つ、ただし 2 つのサブタイプ テーブルの個別のキーはありません)。こうすることで、クエリがよりシンプルになり、マスターと詳細の間に 1:0 の制約を適用でき、代理キーがなくなり、データが正規化されます。

于 2013-06-25T11:45:10.810 に答える
0

として知られる設計パターンです。

として知られる設計パターンです。

これらについては、タグにアクセスして情報タブを開くことで確認できます。

方法 3 には名前がありますが、現時点ではわかりません。

あなたの状況では、方法1を選択します。

方法 1 では、かなり厳密にパターンに従いました。検討することをお勧めすることの1つは、共有主キーです。クラス テーブルの継承と共有主キーはうまく連携します。

于 2013-06-25T12:06:06.117 に答える
0
create table party_type (
  id serial primary key,
  description text not null unique
);

insert into party_type ('description') values
('Organization'),
('Individual'),
('Automated Agent');

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

insert into party (party_type_id, organization_name) values (1, 'Acme, Inc');
insert into party (party_type_id, last_name, first_name) values (2 'Doe', 'John');

create table role_type (
  id serial primary key,
  description text not null unique
);

insert into role_type ('description') values
('Customer'),

create table party_role (
  party_id int not null references party(id),
  role_type_id int not null references party_role_type(id),
  primary key (party_id, role_type_id)
);

/* add both parties as customers: */
insert into party_role values (1, 1);
insert into party_role values (2, 1);

create table identifier_type (
  id serial primary key,
  description text not null unique
);

insert into identifier_type ('description') values
('Social Security Number'),
('Registration Number');

create table party_identifier (
  party_id int not null references party(id),
  identifier_type_id int not null references identifier_type(id),
  id_number text not null,
  primary key (party_id, identifier_type_id)
);

insert into party_identifier values
(1, 2, 'some company reg number'),
(2, 1, 'some ssn')
于 2013-06-25T20:12:30.200 に答える