2

薬局のデータベース システムを再設計しており、新しい設計が最適かどうか、または微調整が必​​要かどうかを確認するための入力が必要です。

ここに古いシステムのスナップショットがあります..

薬局データベース古い

ご覧のように、薬局テーブルには、住所と連絡先情報とともに薬局情報が格納されています。薬局は、請求目的 (pharmacygroup) または販売目的 (バナー グループ) でグループ化されます。請求書グループは、物理的な住所や連絡先情報が異なる場合があります。

これが私の新しいデザインです。薬局と薬局グループの両方のテーブルから住所を分割して、独自のテーブルにし、連絡先用の新しいテーブルを作成しました。それらは、技術担当者、アカウント担当者、所有者担当者などである可能性があるため、contacttypes テーブルがあります。薬局と薬局グループは別々の連絡先情報を持つことができます。私は単一の連絡先テーブルを作成し、それが薬局の連絡先か薬局グループの連絡先かを示す「linktype」と「linkid」列を考えましたが、これが正しいかどうかはわかりません。正しいアプローチ。これは良い設計ですか、それとも結合の数のためにデータ取得の面でコストがかかりますか?? 私が指摘したもう 1 つのことは、古い設計では、外部キー制約を作成していませんでしたが、薬局テーブルには pharmacygroup と bannergroup のグループ ID とバナーグループ ID の参照がありました。おそらく、データ取得の時間を節約できます。これは良いアプローチですか?

薬局データベース デザイン 新規

4

2 に答える 2

4

あなたのデザインは私にはよく見えます。私は常に、システムが本番環境に入った後にデータを再編成するのに時間を費やすよりも、設計段階でいくつかの結合を追加することを好みます。経営陣、営業担当者、財務担当者からどのようなレポートが要求されるかを事前に知ることはできません。適切な関係設計により、自由度が高まります。

JOINまた、パフォーマンスの問題について、いくつかの余分な s だけを責めることはできません。常に以下を確認する必要があります。

  • データ ボリューム (および物理データ レイアウト)、
  • 取引量と密度、
  • I/O、CPU、メモリ使用量、
  • RDBMS 構成、
  • SQL クエリの品質。

私の見解では、JOINs はこのリストの一番下にあります。

RI 制約(参照整合性) に関しては、パフォーマンスを向上させるために主キー/外部キーなしで実行されていたプロジェクトをいくつか見てきました。主な言い訳は、アプリケーションにすべてのチェックが組み込まれており、アプリケーションシステム内の変更の唯一のソースであるということでした。一方で、システムが一貫した状態にあったかどうかは不明であることに同意しました (実際、分析では一貫していないことが示されました)。

私は常に、設計状態に関するすべての可能なキー/制約を作成することに固執します。なぜなら、あなたのデータベースを掘り下げて、より適していると思われるデータを「調整」する「カウボーイ」が常に周りにいるからです。それでも、公式の推奨事項でもある、一括データ操作のためにいくつかの制約/インデックスを一時的に無効にするか、削除することもできます。

不明な場合は、2 つのテスト データベースを作成します。1 つは制約あり、もう 1 つは制約なしです。データを読み込んで、クエリのパフォーマンスを比較します。似たようなものになると思います。

ここにあなたのスケッチに対する私のコメントがあります。決定はすべてあなた次第です。

  • contactsで行ったのと同じ方法で共通テーブルを作成したい場合があります。addressesつまり、テーブルからリレーションを参照する代わりcontact_idowner_contact_id、、、などの列をターゲット リレーションに追加します。contacts
  • テーブルには 1 つの列しかないためcontacttype(そして、共通の がある場合contacts)、唯一のフィールドを移動して、このテーブルを避けることをお勧めします。
  • テーブルの単数形/複数形の名前が混在しているようです。ここでは一般的なパターンに固執することをお勧めします。個人的には単数の方が好きです。
  • In pharmacygroupyour PK is named id, 残りのすべての PK はtableid パターンに従いますが、ここで共通のパターンを使用すると、後でスクリプトを記述しやすくなります。
  • テーブルにはaddresses、 のようなアンダースコア付きのフィールドがありますがstreet_name、他の場所では避けます_— 共通にすることを検討してください。
  • 参照の名前は異なります。それほど重要ではありませんが、制約の名前に依存しなければならないシステムがいくつかあるので、ここでいくつかのパターンを使用することをお勧めします。私は次のものを使用します:

    1. prefix p_f_c_t_u_またはi_主キー、外部キー、チェック制約、トリガー、一意およびその他のインデックスの場合。
    2. テーブルの名前;
    3. 制約/インデックス/トリガーが参照する列の名前。

テーブルに単数形の名前を付けることを好むのはなぜですか? table私は常に_idパターンを使用してPKに名前を付けているため、IMHOpharmacy_idの方が見栄えがよくなりpharmacies_idます。メインテーブルにロードする前にデータの一貫性チェックを実行するときに、このパターンに依存する汎用スクリプトがたくさんあるため、このアプローチを使用します。

編集: 連絡先の詳細。アプリケーションでこれが何を意味するとしてもcontact_id、すべてのテーブルで使用して、それを主要な連絡先にすることができます。いくつかの関係のためにさらに多くの連絡先が必要な場合はowner_contact_idsales_contact_id、 などの別の接頭辞を使用できます。

のようないくつかのリレーションに膨大な数の連絡先が存在すると予想される場合は、次のようpharmacygroupに追加のテーブルを追加できます。

CREATE TABLE pharmacygroupcontact (
    contactid     int4,
    groupid       int4,
    contact_desc  text
);

あなたのイニシャルgroupcontactsを部分的にコピーしますが、2 つの FK と説明で構成されています。アプリケーションがどのように設計されているかを知らないため、どちらのアプローチが優れているかはわかりません。

于 2012-04-11T05:49:27.657 に答える
1

2つの連絡先テーブルがあります。1つ作成してから、リンクテーブルを使用してグループ連絡先と薬局連絡先をリンクします。私は間違いなくFKとPKの関係を設定したいと思います。

于 2012-04-11T04:29:05.057 に答える