1

私がテーブルを持っているとしましょうpeople (id, firstname, lastname)

これらのフィールドを含める必要がある他の2つのテーブルがあるため、peopleテーブルを再利用します:users (id, username, person_id)companies (id, name, contact_person_id)

ここで、企業またはユーザーを取得するには、peopleテーブルに参加する必要があります。peopleテーブルを変更する場合は、すべてのクエリと、おそらく多くのコードを書き直す必要があります。

これは本当の問題ですか?DB構造に欠陥がありますか?おそらくORMのように、低結合を維持するための解決策はありますか?

すべての回答ありがとうございます。

4

4 に答える 4

4

カップリングは、ソフトウェア モジュールに根ざした概念です。

SQL との関連性がわかりません。

両方のテーブルが同じサーバーに存在するため、それらは既に結合されています (サーバーを使用するソフトウェアに関する限り)。あなたが達成しようとしている低結合がわかりません。

ウィキペディアから:

コンピューター サイエンスでは、結合または依存関係は、各プログラム モジュールが他の各モジュールに依存する程度です。

于 2011-04-20T21:00:55.020 に答える
2

外部キーを使用すると、peopleテーブル内のデータに簡単にアクセスできます。はい、テーブルが変更された場合は変更が必要になる場合がありますが、JOIN に影響する何かを変更すると、要件が変更されたことを意味します。people

つまり、JOIN に影響を与えるような方法で姓名を変更する必要があるのは現実的ではありません。これは実際の問題ではありません。

上に示されているのは、データベースの正規化の結果であり、これは一般的で優れた方法です。テーブルを別個のエンティティとして考えると、ソフトウェアとの論理的な関係という点で非常によくあるため、テーブル間の結合が導入されますが、実際には単純化してスケーラビリティを向上させるように設計されています。

これは優れたデータベース設計です。

于 2011-04-20T21:03:05.447 に答える
1

ここで、企業またはユーザーを取得するには、peopleテーブルに参加する必要があります。peopleテーブルを変更する場合は、すべてのクエリと、おそらく多くのコードを書き直す必要があります。

これは本当の問題ですか?DB構造に欠陥がありますか?

いいえ、このコンテキストでは構造に欠陥はありません。それに対するあなたの認識には欠陥があります。

テーブル名と列名は、データベースへのパブリックインターフェイスの一部を構成します。APIと考えてください。どんな種類のコードを書いても、APIを変更すると、コードを書き直す必要があります。データベースAPI(テーブル名と列名)を変更すると、多くのコードを書き直す必要がある場合があります。だが 。。。

バージョン管理システムからデータベースコードをチェックアウトし、「people」テーブルの列名をfirst_name、last_nameに変更するとします。他に変更を加えないと、パブリックインターフェイスが壊れているため、データベースを再構築できません。(「firstname」を選択したビューはビルドを強制終了します。「firstname」への読み取りまたは書き込みを行うストアドプロシージャはビルドを強制終了します。)

ただし、「people」テーブルの名前を変更してビューを作成することで、すぐに回復できます。あなたはこのように前進するかもしれません。

  • 「人」の名前を「人」に変更します。
  • 「人」という名前のビューを作成します。(SELECT * FROM persons;
  • ビューで、変更された2つの列のエイリアスを作成し、first_nameをfirstnameに、last_nameをlastnameにエイリアスします。
  • dbmsが更新可能なビューをネイティブにサポートしていない場合は、ビューを更新可能にするために必要な手続き型コードを記述してください。

「people」という名前のベーステーブルをクエリまたは更新することを期待するコードは、代わりに「people」という名前のビューをクエリおよび更新します。他のコードを書き直す必要はありません。(ベーステーブルに対して動作しているかどうかについて不当な仮定をするコードがない限り。)

リレーショナルデータベースは、更新可能なビューを通じて論理データの独立性を実装します。

于 2011-04-20T22:17:40.653 に答える
1

ほとんどの場合、新しい列を追加するなど、変更の種類は破壊的ではありません。列名やデータ型の変更など、重大な変更はほとんど行われません。

リレーショナル データベース管理システムでは、特定の変更をより簡単にする特別なデータ型を作成できます。FirstName と LastName がユーザー定義型 PersonName として定義されている場合、型を変更すると、列を使用するすべてのクエリとストアド プロシージャに同じ変更が反映されます。残念ながら、ユーザー定義のデータ型を使用する人はほとんどいません。

概念的に、ユーザーと会社の一部である「人」と呼ばれるものが本当に首尾一貫したアイデアを表している場合、必要な変更はどこでも必要になるため、人への変更は混乱を招きません。一方、これが利便性のために概念的に異なるものを一緒にハッキングしている場合は、後で問題が発生する可能性があります。

于 2011-04-20T21:12:00.493 に答える