データベース列の複製に対して説得力を持って議論するにはどうすればよいですか?


47

私は新しい組織で働き始めました。データベースで見たパターンの1つは、ビジネスアナリストがクエリを記述しやすくするためにフィールドを複製することです。DjangoとそのORMを使用しています。

1つのケースでは、特定のコンテキストで患者を識別する一意の文字列を含むMedicalRecordNumberオブジェクトを保持します。我々は持っている登録患者を追跡および関連持つオブジェクトMedicalRecordNumbersをではなく、外部キー関係を使用するよりも、彼らが参加する書き込みを避けることができるように、彼らは文字列を複製(ないパフォーマンス上の理由のために)。このパターンは、データベース全体で共通です。

私にとって、データモデルがクリーンであることの重要性は、それについてよく考えることができるためです。不必要な複雑さは、限られた認知処理時間の無駄です。これは体系的な問題です。結合を書くのが気に入らないことは、修正可能なスキルの問題です。スキーマに戻って変更することを必ずしも支持する必要はありませんが、このタイプの複製に関する問題を説得力を持って明確に表現できるようになりたいです。


2
「結合を書くのが苦手」とはどういう意味ですか?彼らはそれをどのように説明しますか?
scriptin

9
これらの人々はあなたのために働いていますか?あなたは彼らの上司ですか?正当化のほとんどは、en.wikipedia.org / wiki / Database_normalizationにあります。はい、彼らは結合の使用をより良くする必要があります。
ロバートハーヴェイ

1
正規化が望ましい理由に関する文献を調べましたか?
ネイサンタギー

17
内部的に結合を行うビューを追加すると、クエリの作成が同じくらい簡単になりませんか?あなたはそれらを代替案として提案することができます。
CodesInChaos

1
これを(丁寧に)同僚や先輩に伝えましたか?彼らの正当化は何ですか、彼らは何を考慮していますか?これが良い考えである理由はたくさんあります(「パフォーマンスが理由ではない」と言っても、それを裏付ける証拠は何ですか?)。彼らがあまりにも怠zyで硬直していると非難する前に、あなたは彼らがデザインをそのまま持っている理由を考え(そして尋ねました)ましたか?書き込みよりも読み取りの方がはるかに多いかもしれません(分析が重いDB)?変更追跡?歴史的なデータ?みんなに聞いてください-誰かが本当の理由を知っているかもしれません。
ルアーン

回答:


128

運用データベースは、異常を減らすために高度に正規化する必要があります。

分析を容易にするために、分析データベース(ウェアハウス)は高度に非正規化する必要があります。

個別の分析データベースがない場合は、高度に非正規化された[実体化]ビューを作成する必要があります。

単純な分析のために上級ビジネスアナリスト/マネージャーに多くの結合を行うように伝えると、解雇される可能性があります。

アジャイルデータウェアハウスデザインは良い本です

クイックn 'dirtyデータウェアハウスのヒントはこちら


9
これが正しい方法です。
-Nit

6
+1これはまさにビューの目的です。正規化されたデータベースで非正規化されたビューを許可します。
-Nzall

4
絶対に正しいのですが、それが質問に対する主要な答えなので、「異常を減らす」ことをもっと強調すべきだと思います。データの重複/非正規化で最もよく見られる(唯一の?)異常は、列に矛盾するデータが同時に入力されるため、実際のデータが何であるかがわからないことです。何が間違っていたかを判断する方法。後者は、変更を大量に追跡することで軽減できますが、これは安価ではなく、迅速に問題を見つけて見つけることもできません。問題を完全に回避するための費用対効果が高い。
jpmc26

2
考慮すべきもう1つの角度は、開発者がデータを正しい(疑わしい)状態に保つことができるとしても、一貫性を維持するために必要なときにすべての重複フィールドが更新されるようにすることはリソースの大きな浪費になります。
ネイトCK

1
@Panzercrisisトランザクションが「暗黙的」である唯一の方法は、クエリの最後で自動コミットを実行している場合です。通常、本番データベースの場合はそうではありません。アプリケーションでは、トランザクションを自動的に開始し、クエリとは別にコミットを発行する必要があります。これはアプリケーションへのわずかな先行投資ですが、データベース呼び出しの追加を伴うコード変更を簡素化し、開発者が考える必要のある量を減らします(開発速度の向上、開発エラーの削減)。この種の設計は、接続プーリングなどにも適しています。
jpmc26

57

なぜ誰かが選択ごとに結合を書くことを避けたいのか理解しています。

ただし、一度結合を使用してビューを作成し、非正規化テーブルの代わりに使用できます。

したがって、正規化の利点と簡単な選択の利便性を組み合わせます。


12
ビューは友達です。それらを自由に使用してください。また、パフォーマンスのために、RDBMSがマテリアライズドビューをサポートしている場合でも使用できます。
VH-NZZ

13

すでに支持されている回答は、「ビューを使用して」「重複を回避する方法」をカバーしていますが、理由はカバーしていません。基本的に、列の複製は、クエリを記述しやすくするという問題の間違った解決策であることを示しています。しかし、「なぜそれだけのためにランダムな列を複製しないのですか?」まだ立っています。

答えは「マーフィーの法則のため」です。マーフィーの法則によると:

何かがうまくいかない場合は、そうなります。

この場合、複製された列の各行フィールドの内容は、元の列の対応する各行フィールドの内容と同一であると想定されています。間違っている可能性があるのは、一部の行フィールドの内容が元のフィールドと異なる場合があり、大混乱を招くことです。あなたは、彼らが異なっていないことを保証するために考えられる全ての予防措置をとっていると思うかもしれませんが、マーフィーの法則があるためと述べて、彼らができる異なり、彼らはなりますが異なります。そして大混乱続きます。

これがどのように起こるかの例として、単純に、重複した列が魔法で満たされないという事実を考えてください。元のテーブルに行が作成されるたびに値を格納するコードを実際に作成する必要があり、元のテーブルが変更されるたびに更新を続けるコードを作成する必要があります。これにより、データベースにデータを入力するコードに過度の負担が加わるという事実は別として(そして、定義上、単にデータベースを照会するコードよりもはるかに重要です)、誰かが、特定の状況下で、この複製を実行します。次に、値が異なります。または、トランザクション内ではなく複製を実行することを覚えている可能性があるため、特定のまれな障害条件では、省略される場合があります。しかし、これらの例を書くのに本当に時間を無駄にする必要はありませんでした。それがうまくいかない場合は、そうなります。


12

良い/悪いではなく、トレードオフの観点から考えると、より生産的です。正規化の利点(特に一貫性)と、クエリの使いやすさの利点をトレードオフしています。

極端な場合、データの一貫性が著しく損なわれると、データベースは役に立たなくなります。極端な場合、毎日クエリを実行する必要があり、信頼できる結果を得る必要がある人にとっては、データベースがあまりにも使い物にならないでしょう。

リスクとコストを削減するために何ができますか?

  • 整合性チェッカーツールを構築し、定期的に実行します。
  • 複製データを一貫して更新するソフトウェアを介して書き込みアクセスをルーティングします。
  • ビューを追加するか、結合を自動的に行うクエリツールを構築して、ビジネスの人々がDB内部ではなく情報の観点から考えることができるようにします。

6

ビジネスアナリストのデータ正規化の最も強力な議論は、データの整合性を促進することだと思います。キーデータが1か所(1列、1テーブル)にのみ保存されている場合、誤った更新によってデータが破損する可能性ははるかに低くなります。彼らはおそらくデータの整合性の重要性を気にするだろうと思うので、これは彼らがデータベースとやり取りする方法を更新するよう説得する良い方法かもしれません。

クエリのやや難しい方法は、データ破損の可能性よりも望ましいと思われます。


6
彼の人々は、すべてのデータが適切に更新されていることを確認するのに十分であると主張します(結合に不快感を抱いている場合、私は異議を唱えます)。おそらくより良い議論は、正規化を避けた場合、RDBMSが提供するACIDの利点のほとんどを失うということです。
ロバートハーヴェイ

4
おそらく、しかしそれはすべてリスクの問題です。クエリが簡単になるため、データベースを破損するリスクを受け入れてもらえますか?
オレクシ

1
ここで悪魔の擁護者を演じると、明らかな反論は、誰かがとにかく更新を台無しにしてデータを破損する場合、それは正規化の有無にかかわらず問題であり、少なくともデータベースに冗長性があると、誰かが破損に気づき、後で修正することさえできるかもしれません。(もちろん、アドホックな非正規化は最も信頼性の高いエラー検出スキームではありませんが、冗長性を介したエラーチェックの原則は堅実です。それが二重入力簿記の仕組みです。)
Ilmari Karonen

または、他の言葉で言えば、データの整合性には、単なるリレーショナル整合性以上のものがあります。完全に正規化されたデータベースを使用すると、誰かが更新を台無しにした場合でも完全なリレーショナル整合性を維持できますが、誤って更新されたデータがゴミになることはありません。
イルマリカロネン

0

他の人が上で提案したことを追加します。これはデータガバナンスの問題です。関連する利害関係者(データアーキテクトおよびデータスチュワード)と協力して、データの原則、ポリシー、命名規則を開発する必要があります。

忍耐強く、整然と働きましょう。変更は一晩では発生しません。


0

終了する。

正直に言うと、正規化、一貫性について議論し、まったくの怠によって引き起こされるクレイジーなバグと戦うのに何ヶ月も費やすことができます。

または、時間とフラストレーションを節約して今すぐ終了することもできます。

優秀なプログラマーはとても怠け者です。彼らは顧客と管理のニーズを理解しています。しかし、最も重要なのは、彼らはうまく問題を解決することを理解し、うまく設計された、よく実装ソリューションを使用すると、それら個人的に保存し、巨大な仕事の量、努力、そして最も重要な苦しみやストレス。

したがって、優れたエンジニアリングを理解し、評価する場所で作業する方がはるかに優れています。

幸運を。


後から:多分彼らが必要とするのはBI / OLAPツールでしょう... http://en.wikipedia.org/wiki/Online_analytical_processing

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.