問題タブ [denormalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1182 参照

database - 船舶管理データベース構造の議論 (非正規化すべきか?)

私のソフトウェアは数日前に製品化されましたが、データベース構造について少し議論したいと思います。

このソフトウェアは、船舶に関するデータを収集します。現在、船舶ごとに 174 の詳細があります。各詳細は、テキスト値、長いテキスト値、数値 (指定された長さ、指定された小数点以下の桁数の有無にかかわらず)、日付、日付のいずれかです。時間、ブール値フィールド、多くの値を持つメニュー、データのリストなど。

次の表で問題を解決しました

この記事を読みました: http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspxおよびhttp://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID :10678084117056

記事には、これは問題を処理する正しい方法ではないと書かれています。

私の顧客は、詳細の説明を変更し、詳細を追加するため、詳細とグループの管理 GUI を持っています。

データ入力フォームは、DetailGroups および DetailTypes から構造を読み取ることによって動的に構築され、各詳細タイプは指定された入力コントロールを生成します。

コメントは、この問題を解決する別の方法は、テーブルから列を動的に作成および削除することであることを示唆しています。

どう思いますか?

図のスクリーンショット: http://img24.imageshack.us/my.php?image=66604496uk3.png

0 投票する
2 に答える
581 参照

nhibernate - ストアドプロシージャを使用せずにNHibernateで非正規化された更新が可能ですか?

ある程度計画された非正規化(DBAによって計画された)を備えたデータベースを持つプロジェクトでNHibernateを使用することを考えています。1セットのテーブルから読み取り、1つの列を1つのプロパティにマッピングすることは問題ではありません。ただし、更新するときは、1つのプロパティを元のテーブルの元の列にマップし直し、さらに非正規化されたテーブルのその列のコピーをいくつか更新する必要があります。ストアドプロシージャを使用せずにNHibernateでこれを行うことは可能ですか?

編集:私はNXCの答えに同意する傾向がありますが、この質問は、データベースで問題を解決するのではなく、NHibernateの問題を解決する方法についてです。

0 投票する
6 に答える
1000 参照

mysql - 合計を非正規化する必要がありますか?

私は単純な正規化されたデータベースを使用してWebサイトで作業しています。

PagesというテーブルとViewsというテーブルがあります。ページが表示されるたびに、そのビューの一意のレコードがビューテーブルに記録されます。

サイトにページを表示するときは、単純なMySQL COUNT()を使用して、表示するビューの数を合計します。

この問題を除いて、データベースの設計は問題ないようです。何千もの中で最も閲覧された上位10ページを取得する方法がわかりません。

各ページのビューの総数を保持するためにPages.views列を追加して、Pagesテーブルを非正規化する必要がありますか?または、最も閲覧された上位10ページをクエリする効率的な方法はありますか?

0 投票する
8 に答える
518 参照

sql - テーブルデザイン

テーブルが次のようになっていると仮定して、これは良いデザインなのだろうかと思っていました

country fk が 3 つのテーブルで繰り返されていることに注意してください。2つのテーブルでfkが繰り返されている状態ですか?これが良いデザインかどうか誰か教えてください。もしそうなら、なぜですか?なぜなら、私はそれを頻繁に繰り返す必要があるとは思わない.

乾杯

0 投票する
1 に答える
2499 参照

oracle - Oracle: 名前と値のペアをテーブルにフラット化する

この問題に対処するためのより簡単な方法について、誰かがアドバイスを提供できることを願っています。高度に正規化されたデータ セットのフラット ビューの作成に取り組んでいます。フラット化の目的は、通常の人がレポート作成に使用できるビューを提供することです。ソース データには、次に示すようにいくつかのテーブルが含まれています。

レコード値テーブルの variable_id は、アドレスや口座残高など、元の入力ストリームの変数の 1 つに対応します。12 個の変数を含む入力レコードの場合、レコード値テーブルには 12 行あります。

元のプロセスへの入力には、さまざまな幅と変数名のレコードが含まれます。これらは、record_values テーブルで名前/値のタプルに分割されます。変数を次のようなレコードに再構築する手順を書いています

私の現在のアプローチは、指定された一連の実行の一意の変数を見つけてテーブルを動的に構築し (詳細はここでは重要ではありません)、テーブルを作成する SQL 文字列を構築することです。

私の課題は、元のデータからこの結果の作業テーブルを効率的にロードする方法です。変数の名前と数は run_id によって異なるため、これにアプローチするために私が考えることができる唯一の方法は、次のようなものです。

親テーブルには数億の行があるため、これは永遠に実行されます。

目的の行ごとに 1 つの更新を行うために使用できるアプローチを生成する方法について、誰かが考えを持っていますか?

元のテーブルの設計に飛びつく人がないように - このようにするビジネス上の理由がありました。私はそれが好きではありませんが、そうするのには十分な理由がありました。

ご意見をお寄せいただきありがとうございます。

アンドリュー

0 投票する
4 に答える
12222 参照

sql - Oracle でテーブルの同期を維持する

レガシー システムと新しい光沢のあるバージョンを比較するために、サイド バイ サイド テストを実行しようとしています。レガシー システムのデータを格納する Oracle データベース テーブル A と、新しいシステムのデータを格納する同等のテーブル B があるため、テストの間、データベースは非正規化されます。(また、従来のシステムとテーブル A は固定されています - 変更は許可されていません)

私がやりたいことは、A での頻度の低い DML 操作が B に伝播できるようにすることです。これを行うためにトリガーのペアから始めましたが、トリガーが実行されるとテーブルが変更され、例外がスローされるという明らかな問題にぶつかりました。

この問題を処理する標準的な方法はありますか? dbms_scheduler を使用するかどうかについて、さまざまなレポートを読みました...

ありがとう、

アンディ

更新: 私は問題全体から抜け出し、すべてのストアド プロシージャが A を更新し、B も更新し、その逆も同様であることを確認しました。

将来同じ問題に直面した場合、彼の提案に従うため、Quassnoi の回答を承認済みとしてマークしました。

テーブルAとBに2つの挿入/更新ステートメントレベルのトリガーを追加することで簡単に機能するようになったため、JosephStyonの回答をマークアップしました。次に、実行されたトリガーに応じて、AまたはBをマスターテーブルとして使用してマージ手順を実行します(最初に、ターゲット テーブルがマージによって変更されることを確認し、そうでない場合は早期に終了します)。

0 投票する
8 に答える
10175 参照

sql - SQL クエリによるデータの安全な正規化

顧客のテーブルがあるとします。

このテーブルには主キーがありません。ただし、customer_nameandは任意の に対して一意であるcustomer_address 必要customer_numberがあります。

このテーブルに多くの重複した顧客が含まれることは珍しくありません。この重複を回避するために、次のクエリを使用して一意の顧客のみを分離します。

幸いなことに、テーブルには従来から正確なデータが含まれていました。つまり、競合するcustomer_nameorがあったことは一度もありませcustomer_addresscustomer_number。ただし、競合するデータがテーブルに入ったとします。問題の複数の行を返すのではなく、失敗するクエリを作成したいと考えていますcustomer_number

たとえば、次のクエリを試してみましたが成功しませんでした。

標準 SQL を使用してそのようなクエリを作成する方法はありますか? そうでない場合、Oracle 固有の SQL に解決策はありますか?

編集:奇妙なクエリの背後にある理論的根拠:

正直なところ、この customers テーブルは実際には存在しません (ありがたいことに)。クエリのニーズを示すのに十分明確になることを期待して作成しました。ただし、その例に基づいて、そのようなクエリの必要性が私の心配の中で最も少ないことに人々は (幸いなことに) 気づいています。したがって、私は抽象化の一部を剥がして、このようなテーブルの忌まわしさを示唆しているという私の評判を取り戻さなければなりません...

外部システムから請求書 (1 行に 1 通) を含むフラット ファイルを受け取りました。このファイルを行ごとに読み取り、そのフィールドをこのテーブルに挿入します。

ご覧のとおり、外部システムから到着するデータは非正規化されています。つまり、外部システムには、請求書データとそれに関連する顧客データの両方が同じ行に含まれています。複数の請求書が同じ顧客を共有する可能性があるため、顧客データが重複する可能性があります。

すべての顧客がシステムに登録されていることが保証されるまで、システムは請求書の処理を開始できません。したがって、システムは一意の顧客を識別し、必要に応じて登録する必要があります。これが、クエリが必要な理由です。非正規化されたデータを操作していたため、制御できませんでした

これが質問の本来の意図を明確にするのに役立つことを願っています。

編集: 良い/悪いデータの例

明確にするために:customer_name特定の に対してcustomer_address一意である必要があるだけです。customer_number

最初の 2 行は同じで 1 であるため問題ありcustomer_nameませcustomer_addresscustomer_number

中央の 2 つの行は、同じcustomer_nameand customer_addressfor customer_number2 であるため問題ありません (別の行customer_numberには同じcustomer_nameandがありますがcustomer_address)。

3には 2 つの異なるesがあるため、最後の 2 行は問題ありませんcustomer_addresscustomer_number

私が探しているクエリは、これらの 6 つの行すべてに対して実行すると失敗します。ただし、最初の 4 行のみが実際に存在する場合、ビューは次を返す必要があります。

customer_nameこれで、「競合する」という言葉の意味が明確になることを願っていcustomer_addressます。ごとに一意である必要がありますcustomer_number

外部システムからデータを適切にインポートする方法を説明している人に感謝します。実際、私はすでにそのほとんどをすでに行っています。目の前の質問に集中しやすくするために、私がやっていることのすべての詳細を意図的に隠しました。このクエリは、検証の唯一の形式ではありません。私はそれが素晴らしい仕上げになると思っただけです(いわば最後の防御)。この質問は、SQL で可能なことを調査するために作成されたものです。:)

0 投票する
5 に答える
1758 参照

database - 非正規化は、クエリ、結合、および応答時間にどのような影響を与えますか?

非正規化する前に、これが次のことにどのような影響を与えるのか疑問に思っています。

  • クエリ応答時間
  • データベースの行の幅
  • 結果に必要な結合
  • リクエストを完了するために必要なクエリの数

私が間違っていなければ、これらすべてが削減されるようですか?

0 投票する
4 に答える
490 参照

sql-server - パフォーマンスのためにDBスキーマを破棄するかどうかを説明してください:(

Sql 2008 (それ以前は '05) で、ほぼ 3 年間、データベースを運用しています。うまくいきましたが、あまりパフォーマンスが高くありません。そのため、スキーマとクエリを微調整して、いくつかの処理を高速化しています。また、メイン テーブルのスコアには、テーブルごとに約 1 ~ 3 ミルの行が含まれています (サイズの推定値を与えるため)。

サンプルのデータベース ダイアグラムを次に示します (Soz、NDA に基づいているため、元の図を表示できません) :-

代替テキスト http://img11.imageshack.us/img11/4608/dbschemaexample.png

注意すべきこと(これは私の問題に直接関係しています):-

  • ビークルには 0 (NULL) または 1 つのラジオがあります。(左外部結合)
  • 車両には 0 (NULL) または 1 つのカップホルダー (左外側結合) を設定できます。
  • 車両には 1 つのタイヤ タイプ (内部結合) があります。

まず、これは正規化されたデータベース スキーマのように見えます。私はDB理論が嫌いなので、これは(少なくとも)3NFだと思います...有名な最後の言葉:)

これら 2 つの外部結合と内部結合が頻繁に呼び出され、多くのステートメントでさらにいくつかの結合が行われるため、データベースのパフォーマンスが低下しています。

これを修正するために、 indexed viewを試してみようと思いました。ビューの作成は簡単です。しかし、インデックスを作成しても機能しません->結合または自己参照テーブルを使用してインデックス付きビューを作成できません(別の問題:( )。

それで、私は何時間も泣いて(そして/ wrists 、髪を染めて、それについてのエモソングを書いて、それをmyfailspaceに載せました)、次のことをしました...

  1. 「オプション」の各外部結合テーブル (この例では、ラジオとカップホルダー) に新しい行を追加しました。ID = 0、残りのデータ = 'Unknown Blah' または 0's.
  2. 親テーブルを更新して、NULL データが 0 になるようにします。
  3. 外部結合から内部結合への関係を更新します。

これで動作します。インデックス付きビューを作成することもできます。これは現在非常に高速です。

だから...私は苦しんでいます。これは、私が教えられてきたことすべてに反しています。汚い気がします。1人。感染した。

これは悪いことですか?これは、パフォーマンスのためにデータベースを非正規化する一般的なシナリオですか?

これについていくつか考えてみたいと思います:)

PS。Google がランダムに見つけたこれらの画像は、私ではありません。