2

可能な限りスケーラブルになるようにデータベースを設計しようとしているので、単純なシナリオでコンセプトをテストしています。

contactテーブルがあるとしましょう。通常、連絡先には 、addressphone numbermobile numberおよび がありemail addressます。

1 つのテーブルがこの情報を保持できます。ただし、連絡先にこれらの詳細が複数ある場合はどうなるでしょうか。私の解決策は、ジャンクションテーブルを次のように使用することです。

contact -* contact_address *- address
contact -* contact_phone *- phone
contact -* contact_mobile *- phone
contact -* contact_emailaddress *- emailaddress

これにより、連絡先に関するすべての情報を取得できます。さらにaddressphoneおよびemailaddressテーブルは、データの分析から単純な再利用までを目的としたデータ バンクになります。

ただし、これがパフォーマンスにどのような影響を与えるのか、また、これが良い習慣であるかどうかはまだわかりません。これは主に、contactテーブルが an のみを保持し、id他には何も保持しないためです。

1つの注意点は、これはsymfony2でdoctrine2を使用しているため、長いクエリを書くことは問題にならないということです.私の主な関心事は上記のものです.これは1つのテーブルから8つにジャンプしました.連絡先は私がこれ。

4

3 に答える 3

0

連絡先に複数のアドレスがある場合、ジャンクション テーブルは使用せず、単にアドレスから連絡先への外部キーを使用します。

考慮すべき要素はたくさんありますが、この設計の方がパフォーマンスが高い可能性が高いと思います。

アドレスが複数の連絡先に関連付けられ、連絡先が複数のアドレスを持つ可能性がある場合は、ジャンクション テーブルを使用します。

于 2013-05-09T10:13:53.090 に答える
0

テーブル継承を使用します。

単一テーブルの継承の例:

create table address_type(
  id char(1) primary key,
  description text not null unique
);

insert into address_type values
('t', 'Telephone Number'),
('e', 'E-mail Address'),
('m', 'Mailing Address'),
('w', 'Web Address');

create table address_role(
  id char(1) primary key,
  description text not null unique
);

insert into address_role values 
('f','Fax'),
('m','Mobile'),
('h','Home'),
('w', 'Work');

create table address(
  id serial primary key,
  type char(1) not null references address_type(id),
  telephone_number varchar(15) null,
  email_address varchar(320) null,
  web_address varchar(2083) null,
  suite_or_apartment text null,
  city_id bigint null references city(id),
  postal_area_id bigint null references postal_area(id)
);

create table party(
  id serial primary key,
  name varchar(255) not null
);

create table party_address(
  party_id bigint not null references party(id),
  address_id bigint not null references address(id),
  from_date date not null default current_date,
  to_date date null,
  role char(1) null references address_role(id),
  telephone_extension varchar(5) null,
  primary key (party_id, address_id, from_date)
);
于 2013-05-11T19:07:34.367 に答える