1

以下の分析を見て、2 つのうち最適なデータベース設計 (InnoDB) を教えてください。要件 - 指数関数的に増加すると予想される多数の同時 DB 接続が存在する場合に、ユーザーが待機する必要のない高速な書き込みと読み取り。ユーザーが待たなければならない場合、ディスク容量の利点は関係ありません。

仮定 – 単一の CPU (比較用)

方法 1 (M1) Table1 UserProfile -> UserID、都市、州、国

Method2 (M2) (正規化) Table2a UserProfile->UserID,LocationsID Table2b Locations-> LocationsID, City, State, Country

書く(順番がバラバラ)

を。テーブルに書き込む

M1-Direct Write= t1 M2-(Table2b を検索してレコードの存在を確認する=t2+ 一致しない場合は挿入する=t1 Table 2a に UserID と LocationsID を書き込む=t3) (t1+t2+t3) > t1

b.CPU 割り込み

M1=1、M2=2

c.ディスク I/O

M1=1、M2=2

d.ロウロック&リリース

M1=1、M2=2

e. ディスクスペース

M1=多い、M2=少ない(M2のアドバンテージのみ)

読み取り (レコードがキャッシュにないと仮定)

を。テーブルから読み取る

M1-直読=t4、M2-Join-t5 t5>t4

b. CPU 割り込み

M1=1、M2=2

c.ディスク I/O

M1=1、M2=2

Table2b が事前に設定されている場合、または国、州、都市のドロップダウンが数値でタグ付けされている場合、Method2 で費やされる時間を改善できると思います。ロードバランスしてもM1は魅力的なデザインになりそうです。BW を増やすと、同時 DB 接続が増えるため、状況が悪化する可能性があります。あなたの考えを聞かせてください

4

1 に答える 1

1

Method2 (M2) (正規化) Table2a UserProfile->UserID,LocationsID Table2b Locations-> LocationsID, City, State, Country

都市、州、および国を ID 番号に置き換えました。場合によっては、これが適切な設計上の決定になることもありますが、常に適切な設計上の決定とは限りません。そしてそれは正規化とはの関係もありません。(「ID 番号を使用しました」通常形などはありません。)

国際標準がある場合、通常はそれを使用するのが理にかなっています。ISO 3166-1を参照してください。3 文字のコードの方がわかりやすいかもしれません。

-- Untested code.
create table countries (
  iso_country_code char(2) not null,
  country_name varchar(35) not null,
  primary key (iso_country_code),
  unique (country_name)
);

create table states (
  state_code char(2) not null,          -- application-dependent, consider ISO 3166-2
  state_abbrev varchar(7) not null,
  state_name varchar(35) not null,
  iso_country_code char(2) not null,
  primary key (state_code, iso_country_code),
  unique (state_abbrev, iso_country_code),
  unique (state_name, iso_country_code),
  foreign key (iso_country_code) references countries (iso_country_code)
);

create table cities (
  city_name varchar(35) not null,
  state_code char(2) not null,
  iso_country_code char(2) not null,
  primary key (city_name, state_code, iso_country_code),
  foreign key (state_code, iso_country_code) 
    references states (state_code, iso_country_code)
);

create table UserProfile (
  UserID integer not null,
  city_name varchar(35) not null,
  state_code char(2) not null,
  iso_country_code char(2) not null,
  primary key (UserID),
  foreign key (city_name, state_code, iso_country_code) 
    references cities (city_name, state_code, iso_country_code)
);

国、州、都市ごとにテーブルを分けると、コンボ ボックスに SELECT ステートメントを簡単に入力できます。数値の「タグ」は必要ありません。これら 3 つのテーブルはすべて重要です。非プライム属性はありません。5NFだと思います。

経験則として、行が存在するかどうかを確認するために行を検索せず、存在しない場合は挿入します。これには、データベースへの 2 回の往復が必要です。

代わりに、行を挿入し、重複している場合に発生するエラーをトラップします。とにかくエラーをトラップする必要あります。複製以外にも、挿入の成功を妨げる可能性のあるものがたくさんあります。

于 2013-05-13T23:00:50.643 に答える