問題タブ [normalization]
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.
database-design - DB 設計: 共通属性のスーパークラスを作成する必要があるのはいつですか?
私のジレンマを説明するために、まず問題の例から始めましょう (ここから盗まれました)。データベースに次のような GradStudent テーブルがあるとします。
ただし、ティーチング アシスタントのみがコースの割り当てを持ち、リサーチ アシスタントのみが researchGrant を持つため、これら 2 つのうちの 1 つは常に null になります。明らかにこれは最適ではなく、これを行う方が良いでしょう:
TeachAsst と ResearchAsst には、GradStudent テーブルからの外部キー (おそらく "studentID" サロゲート) があります。
また、次のように 2 つの完全に別個のテーブルを作成することが最善ではない理由も理解しています。
同じ意味を持つ多くの属性を繰り返しているからです。
ただし、次のような共通のフィールドがほとんどない場合、2 つの異なるクラスは理にかなっています (私はそう思います)。
ここでは、共通の「名前」しかないので、「名前」の属性が 1 つだけの GradStudent スーパークラスを持つのはばかげているでしょうか? 転換点はどこですか?共通情報のスーパークラスを持つ時期や、2 つのクラスを完全に分離する時期をどのように決定しますか? TeachAsst を作成または更新するには、1 つではなく 2 つのテーブルを変更する必要があるため、スーパークラスを使用すると、ほとんどの CRUD が少し難しくなります。
別の例として、あなたが取り組んでいる DB に、さまざまな電子デバイスの情報を測定することが含まれているとします。また、カメラと携帯電話には共通の長さ/幅/高さがありますが、他の測定値のほとんどは一致しません (たとえば、カメラには音声情報がなく、携帯電話にはレンズやビューポートの測定値がありません)。 )。そのため、少量の共通情報をスーパークラス テーブルに入れるよりも、cameraData テーブルと mobileData を完全に分離する方が簡単に思えます。どう思いますか?サブクラスの記述データのわずかな割合であっても、共通データを常にスーパークラスにまとめる必要があるという一般的な規則はありますか?
編集: 大学院生の例では、大学院生はティーチング アシスタントまたはリサーチ アシスタントのいずれかであり、役割を切り替えることはなく、両方でもどちらでもないと仮定しましょう。
sql - SQL VIEWは常に1NFである必要がありますか?
SQL VIEWは、永続化される場合とされない場合があるグローバルな論理テーブルです。しかし、それはまだテーブルです。したがって、VIEWは常に第一正規形(1NF)に準拠する必要がありますか?つまり、重複する行はなく、スカラータイプのみ、上から下または左から右の順序などはありません。より高い正規形はどうでしょうか。
私にとって、私のアプリケーションはストアドプロシージャの結果を「消費」し、ビューはSQLクエリによって「消費」され、これら2つの使用法は相互に排他的です(つまり、SQLを使用してストアドプロシージャの結果セットをクエリせず、アプリケーションはクエリを実行しませんSQLコードを含む)。他の人がVIEWを使用して、列内の複数の値を1つの行(通常はコンマ区切り形式)に「連結」するのを見てきました。このような列に対してSQLクエリで述語を記述するには、次のような応急修理が必要です。
したがって、クエリできるすべてのテーブルがスカラー型のみで構成されていることを期待するのは妥当なようです。私はこれを考えることによってあまりにも「純粋」であるのですか?
database-design - 列にメタデータを保存する方法
今後のスーパーヒーロー映画のリリースに関するインサイダー情報を収集していて、メインの映画テーブルが次のようになっているとします。
表1
これは一般的に非常にうまく機能し、非常に簡単なクエリと行間の比較を可能にするはずです。
ただし、各データファクトのソースと、ファクトを発見したジャーナリストの名前を追跡する必要があります。これは、次のようなEAVテーブルのようなものを示唆しているようです。
表2
これにより、必要なメタデータを簡単にキャプチャできますが、クエリが難しくなります。1つの映画のすべての基本データを取得するには、もう少し時間がかかります。より具体的には、ここで4つの行を処理して、グリーンランタンに関する4つの重要な情報を取得する必要がありますが、表1では、1つの適切にカプセル化された行です。
だから私の質問は、私が今説明した複雑さを考慮して、そして私は一般的にEAVテーブルが避けられるべきであることを知っているので、EAVはまだ最良の解決策ですか?このデータを表現する唯一の合理的な方法のようです。私が見る他の唯一の選択肢は、次のようなメタデータのみを格納する別のテーブルと組み合わせてテーブル1を使用することです。
表3
ただし、これは非常に危険です。テーブル1の列名を「Villain」から「PrimaryVillain」に変更しても、テーブル3の行は単に「Villain」と表示されるため、残念ながら関連データが分離されます。これは、「属性」列がテーブル1の列の列挙として機能する別のテーブルにリンクされている場合に役立ちます。もちろん、DBAは、この列挙テーブルをテーブル1の実際の列と一致するように維持する責任があります。列挙テーブルを手動で作成する代わりに、テーブル1の列の名前を格納するSQL Serverのシステムビューを使用することで、これをさらに改善できる可能性があります。システムビュー。
何を指示してるんですか?EAVは行く唯一の方法ですか?
そして、それが1つのメタデータ列(「ジャーナリスト」なしの「ソース」のみ)であった場合はどうなりますか?それでもEAVルートに進む必要がありますか?「Director」、「Director_Source」、「Leading Male」、「Leading Male_Source」などの列を作成できますが、すぐに醜くなります。私が考えていないより良い解決策はありますか?
不明な点がありましたらコメントしてください。必要に応じて追加します。そうそう、私が使用した映画データは作成されています:)
編集:私の主な質問を簡潔に言い換えると、テーブル1のシンプルさと真のRDBMS設計が必要です。これは、安全でアクセス可能な方法で属性のメタデータを保存しながら、映画のエントリを実際によく説明しています。これは可能ですか?それともEAVが唯一の方法ですか?
編集2:さらにいくつかのWeb調査を行った後、メタデータを列に格納したいという願望を中心としたEAVに関する議論はまだ見つかりません。EAVを実装する主な理由は、ほとんどの場合、動的で予測不可能な列ですが、私の例ではそうではありません。私の例では、常に同じ4つの列があります。ディレクター、主要な男性、主要な女性、悪役です。ただし、各行の各列に関する特定の事実(ソースおよびジャーナリスト)を保存したいと思います。EAVはこれを容易にしますが、私はそれに頼ることを避けたいと思います。
アップデート
列の名前を「Movie」から「Name」に変更し、テーブル全体を「Movie」と呼ぶことを除いて、表2の設計を使用して、表1に戻るためのSQLServer2008のピボット操作を次に示します。
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に載せました)、次のことをしました...
- 「オプション」の各外部結合テーブル (この例では、ラジオとカップホルダー) に新しい行を追加しました。ID = 0、残りのデータ = 'Unknown Blah' または 0's.
- 親テーブルを更新して、NULL データが 0 になるようにします。
- 外部結合から内部結合への関係を更新します。
これで動作します。インデックス付きビューを作成することもできます。これは現在非常に高速です。
だから...私は苦しんでいます。これは、私が教えられてきたことすべてに反しています。汚い気がします。1人。感染した。
これは悪いことですか?これは、パフォーマンスのためにデータベースを非正規化する一般的なシナリオですか?
これについていくつか考えてみたいと思います:)
PS。Google がランダムに見つけたこれらの画像は、私ではありません。
language-agnostic - 関連データをマッピングおよび正規化する方法は何ですか?
与えられたランダムな関連データをより簡潔なカテゴリに集める必要があるとしましょう。
例-次のデータが与えられます。注-他の関連する列データがいくつも存在する可能性があります。
タスク-上記を統合して正規化し、事前定義されたクリーンなグループにします。
完成したデータがどのように保持されるかについて心配する必要はありません。ただし、グループ化のルールをどのように維持および管理するかに焦点を当ててください。
唯一の仮定:データベースを使用してグループ化ルールを永続化することはできません。したがって、「正規化」と言うときは、リレーショナルデータベースの正規化ルールの観点から言っているのではありません。ただし、ランダムデータを一貫性のある状態にするために、(上記のように)データ入力から不整合を取り除きたいと考えています。
では、利用可能なオプションは何ですか?テクノロジーにとらわれないまま:
XML?
設定ファイル?
設定ファイル(コンパイルされているかどうか)?
Iniファイル?
コード?
等
各回答の長所と短所をリストします。そして、これは確かにエクササイズですが、それは現実の問題です。それで、あなたのクライアント/雇用者があなたにこれを任せたと仮定してください。
normalization - 複数のソースによる実績の正規化
良いアルゴリズムの推奨事項を探しています。
ユーザーと実績があります。ユーザーはアチーブメントを作成し、それを他のユーザーに提供します。各アチーブメントには、ユーザーが指定したポイント値が関連付けられています。ユーザーの合計ポイントは、すべての実績の合計です。
基本的:
わかりました、このシステムは明らかに非常にゲーム可能です。多くのアカウントを作成し、お互いにたくさんの成果をあげることができます。ポイント値をユーザーが指定したものとは異なる値にスケーリングすることで、それを少し削減しようとしています。
- すべてのユーザーが正直であると仮定しますが、難しさを異なる方法で評価しているだけです。ポイント値を正規化するにはどうすればよいですか? AKA 1 人のユーザーは簡単な成果ごとに 5 ポイントを与え、別のユーザーは 10 ポイントを与えます。どうすればそれらを 1 つの値に正規化できますか。目標は、ポイントが難易度に比例する分布です。
- ポイント値の判断が苦手なユーザーがいる場合、アチーブメントを獲得したユーザーの数から難易度を割り出すにはどうすればよいですか?
- ユーザーはほとんどがバラバラなグループに分割され、1 人のユーザーが他のユーザーのセット全体に実績を与えることができると仮定します。それは前の 2 つのアルゴリズムに役立ちますか? たとえば、ユーザー A は奇数で終わるユーザーにのみ成果を与え、ユーザー B は偶数で終わるユーザーにのみ成果を与えます。
- 誰もが悪意を持っている場合、ユーザーがポイント値を過大に膨らませることができないようにするには、どれくらい近づくことができますか?
注: ユーザーへの寄付の質は、彼が受け取った実績の数とはまったく関係ありません。多くのギバーは、自分自身は何も受け取っていない単なるボットですが、特定のアクションを実行したユーザーに自動的に報酬を与えます。
私の現在の計画はこのようなものです。私は、私から成果を得た 1 人あたり 10 ポイントの割り当てを持っています。合計 55 人に 10 個の実績を配布した場合、私の割り当ては 550 です。これは、それを取得した人数に基づいて各実績に割り当てられます。分布が[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
各アチーブメントを取得した人である場合、ポイント値は になります[50, 25, 16.6, 12.5, 10, 8.3, 7.1, 6.25, 5.5, 5]
。
私のアプローチと代替の推奨事項に関する問題は大歓迎です。また、私が見逃したと思われる他のケースを投稿してください。リストに追加します. ありがとう!
mysql - mySQL データベースの自動正規化 - 方法は?
80 列と 1000 万行の 1 つの巨大なテーブルで満たされた mySQL データベースがあります。データに矛盾がある可能性があります。
自動化された効率的な方法でデータベースを正規化したいと考えています。
java/c++/... を使用して行うこともできますが、可能な限りデータベース内で行いたいと考えています。データベース外での作業は、非常に遅くなると思います。
それを行う方法に関する提案はありますか?始めるのに適したリソース/チュートリアルは何ですか?
正規化とは何かについてのヒントを探しているわけではありません(Googleを使用してこのようなものがたくさん見つかりました)!