リレーショナルデータベースの設計パターン?[閉まっている]


283

デザインパターンは通常、オブジェクト指向のデザインに関連しています。リレーショナルデータベースを作成およびプログラミングするための設計パターン
はありますか?
多くの問題には、必ず再利用可能な解決策が必要です。

例には、テーブルデザイン、ストアドプロシージャ、トリガーなどのパターンが含まれます。

martinfowler.comのような、そのようなパターンのオンラインリポジトリはありますか?


パターンが解決できる問題の例:

  • 階層データの保存(例:タイプが1つのテーブルと1:1のキーと相違がある複数のテーブル...)
  • 可変構造でデータを保存する(例:汎用列vs xml vs区切り列...)
  • データを非正規化する(影響を最小限に抑える方法など...)

:私は、階層データ保存のために、ここで最高のQ&Aに主張するだろうstackoverflow.com/questions/4048151/...
orangepips

1
トピックに関するガイダンスよると、「一部の質問は、上記のカテゴリのいずれかに当てはまる場合でもトピックから外れています。... 本、ツール、ソフトウェアライブラリ、チュートリアルなど推奨または検索するように求める質問オフサイトのリソースはトピックから外れています...」
ロバートコロンビア

@RobertColumbia質問はした上で、話題 ...尋ねた2008年、中
Sklivvz

リレーショナルデータベースとソフトウェアエンジニアリングの多くの領域で、このデザインパターンリソースのリストを確認してください。github.com
DovAmir/

回答:


150

マーティンファウラーの署名シリーズに、リファクタリングデータベースと呼ばれる本があります。これは、データベースをリファクタリングするためのテクニックのリストを提供します。データベースのパターンのリストをあまり聞いたとは言えません。

また、David C. HayのデータモデルパターンとフォローアップのAメタデータマップを強くお勧めします。メタデータマップは、最初に構築され、より野心的で興味深いものです。序文だけでも啓蒙的です。

また、いくつかの事前に用意されたデータベースモデルを探すのに最適な場所は、Len Silverstonのデータモデルリソースブックシリーズボリューム1には普遍的に適用可能なデータモデル(従業員、アカウント、配送、購入など)が含まれ、ボリューム2には業界固有のデータモデル(会計、ヘルスケアなど)、ボリューム3はデータモデルパターンを提供します。

最後に、この本は表面的にはUMLとオブジェクトモデリングについてですが、Peter CoadのUMLによるカラーモデリングは、オブジェクト/データモデルには4つのコアアーキタイプがあるという前提から、エンティティモデリングの「アーキタイプ」主導型プロセスを提供します。


1
この本は、スコットW.アンブラーとプラモドJ.サダラージュによって[リファクタリングデータベース:進化的データベースの設計] [1]というタイトルが付けられており、非常に優れています。[1]:ambysoft.com/books/refactoringDatabases.html
Panos

3
Amblerブックに関して:いいえ、同じ理由で、「列の挿入」または「FK制約の作成」をパターンとしてリストすることはできません。TheGang of 4ブックは、「for」ループがパターンであることをリストしていません。
Tegiri Nenashi 2011

これはパターンではなく、リファクタリングです。抽出メソッドのように、またはパラメータの名前を変更します。リファクタリングとパターンは密接に関連しています。
マイケルブラウン

追加するもの:ファウラーによる「分析パターン」。Hayのものに似ています
Neil McGuigan

2
レンシルバーストンの第3巻は、「デザインパターン」と見なす唯一のものです。最初の2つは、本が書かれた時間枠で一般的なサンプルデータモデルを示しています。ただし、ボリューム3には、実際には特定の問題シナリオに対して複数の設計パターンがあります。たとえば、第4章では、階層/集約/ピアツーピアのシナリオを取り上げ、それぞれの利点と欠点を扱う複数の設計を提供します。
DarrellNorton 2013年

46

デザインパターンは、簡単に再利用できるソリューションではありません。

定義上、デザインパターンは再利用可能です。これらは、他の優れたソリューションで検出されるパターンです

パターンは簡単には再利用できません。ただし、パターンに従ってダウンデザインを実装できます。

リレーショナルデザインパターンには、次のようなものが含まれます。

  1. 外部キーを使用した1対多の関係(マスター/詳細、親子)関係。

  2. ブリッジテーブルとの多対多の関係。

  3. FK列のNULLで管理されるオプションの1対1の関係。

  4. Star-Schema:ディメンションとファクト、OLAPデザイン。

  5. 完全に正規化されたOLTP設計。

  6. ディメンション内の複数のインデックス付き検索列。

  7. 1つ以上のアプリケーションで使用されるPK、説明、およびコード値を含む「ルックアップテーブル」。なぜコードがあるのですか?わかりませんが、使用する必要がある場合、これはコードを管理する方法です。

  8. ユニテーブル。[これをアンチパターンと呼ぶ人もいます。これはパターンであり、時には悪いこともあり、良いこともあります。

  9. 配列テーブル。これは、列に値の配列またはシーケンスがあることにより、最初の正規形に違反するテーブルです。

  10. 混合データベース。これはトランザクション処理用に正規化されたデータベースですが、レポートと分析のための追加のインデックスがたくさんあります。これはアンチパターンです。これを行わないでください。人々はとにかくそれをするので、それはまだパターンです。

データベースを設計するほとんどの人々は、半ダースの「それはそれらの別のものです」を容易に打ち負かすことができます。これらは、定期的に使用するデザインパターンです。

また、これには、使用と管理の管理上および運用上のパターンは含まれません。


私が見た他のいくつかのパターンは、複数の親を持つ子テーブル(つまり、他のテーブルにリンクできるオブジェクトタイプとオブジェクトIDを持つグローバルノートのような)、または自己参照FK(つまり、employee.manager-> employee)です。 id)。また、多くの列を持つシングルトン構成テーブルを使用しました。
r00fus 2010

1
混合使用データベースがアンチパターンなのはなぜですか。データベースからレポートをプルしたい場合はどうすればよいですか?
オリーブ

3
@lhnz:トランザクションデータベースの設計から多く大きなレポートをプルすることはできません-レポートのロックはトランザクションの速度を低下させます。複雑な結合(繰り返し実行される)は、トランザクションのパフォーマンスに対するもう1つのノックです。1つのデータベースで両方を行うことはできません。多くの大きなレポートを作成するには、データをスタースキーマに移動する必要があります。スタースキーマパターンはレポート用に最適化されています。データを移動すると、ロックの競合がなくなります。
S.Lott、2009

テーブルに「まとまりのある」データを保持させる場合、スキーマを正規化すると行ロックの競合が減少しますか?大きなテーブルが2種類のデータセットへの書き込みを処理しているが、両方が同じ行にある場合、これにより不要なロック競合が発生すると考えています。
CMCDragonkai、2015

6

AskTomは、おそらくOracle DBのベストプラクティスに関する単一の最も役立つリソースです。(通常、特定のトピックに関するGoogleクエリの最初の単語として「asktom」と入力します)

リレーショナルデータベースでデザインパターンについて話すことは、本当に適切だとは思いません。リレーショナルデータベースはすでに問題に「設計パターン」を適用しています(問題は「データの整合性を維持しながらデータを表現、保存、処理する方法」であり、設計はリレーショナルモデルです)。他のアプローチ(一般的には廃止と見なされています)は、ナビゲーションモデルと階層モデルです(他にも多くのモデルが存在します)。

そうは言っても、「データウェアハウジング」は、データベース設計におけるやや別個の「パターン」またはアプローチと考えるかもしれません。特に、スタースキーマについて読むことに興味があるかもしれません。


4

長年のデータベース開発の後、私は始める前にいくつかのノーゴーといくつかの質問があると言うことができます:

質問:

  • 今後、別のDBMSで使用しますか?はいの場合、現在のDBMSの特別なSQL要素を使用しません。アプリケーションのロジックを削除します。

使用しない:

  • テーブル名と列名の空白
  • テーブル名と列名の非ASCII文字
  • 特定の小文字または大文字へのバインド。また、小文字と大文字のみが異なる2つのテーブルまたは列を使用しないでください。
  • 「FROM」、「BETWEEN」、「DELETE」などのテーブルまたは列名にSQLキーワードを使用しない

おススメ:

  • ユニコードのサポートにはNVARCHARまたは同等のものを使用してください。そうすれば、コードページに問題はありません。
  • すべての列に一意の名前を付けます。これにより、結合を容易にして列を選択できるようになります。すべてのテーブルに「ID」、「名前」、または「説明」の列がある場合は非常に困難です。XyzIDとAbcIDを使用します。
  • 複雑なSQL式には、リソースバンドルまたは等しいを使用します。別のDBMSに簡単に切り替えることができます。
  • どのデータ型にも強くキャストしません。別のDBMSはこのデータ型を持つことができません。FOrの例OracleはSMALLINTだけを持っているわけではありません。

これが良い出発点であることを願っています。


7
コメントは非常に有益で便利ですが、デザインパターンではありません。これらはベストプラクティスです。おかげで、
Sklivvz

7
一意の列名の推奨に同意しません。明確化するものがない場合でも、customeridと言うよりも、明確化するためにcustomer.idと言います。
ポールトンブリン

1

あなたの質問は少し曖昧ですが、私はUPSERTデザインパターンと考えることができると思います。実装していない言語の場合MERGE問題を解決するための選択肢の数を(適切な行が存在する場合はUPDATE、そうでないINSERTが存在)。


UPSERTはコマンドであり、SQL言語の一部です。柄ではありません。
Todd R

UPSERTは、SQL言語の一部のバリアントのコマンドです。多くのプラットフォームには、UPERTがないか、最近入手しただけです。
Steve Homer

@ToddR-「パターン」は実際には言語またはモデルの欠点にすぎず、ユーザーが回避策を作成する必要があると(少し皮肉なことに)聞いたことがあります。UPSERTの機能はわかりませんが、一部の SQLには追加されてますが、他のSQLには追加されていませんが、それはパターンです。
マーティンF

1

意味はパターンによって異なります。人/会社/トランザクション/製品などを考えているのであれば、はい-すでに多くの汎用データベーススキーマが利用可能です。

Factory、Singletonを考えている場合は...いいえ、DBプログラミングには低レベルであるため、これらは必要ありません。

データベースオブジェクトの名前付けを考えている場合は、それ自体がデザインではなく、規則の範疇に属しています。

ところで、S.Lott、1対多および多対多の関係は「パターン」ではありません。これらは、リレーショナルモデルの基本的なビルディングブロックです。


(人、顧客、従業員)のようなデータベースの継承についてはどうでしょうか?
Muflix、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.