問題タブ [database-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 - 区切りリストをデータベース列に格納するのは本当に悪いことですか?
チェックボックスのセットを備えたWebフォームを想像してみてください(それらのいずれかまたはすべてを選択できます)。データベーステーブルの1つの列に格納されている値のコンマ区切りリストにそれらを保存することを選択しました。
これで、正しい解決策は2番目のテーブルを作成し、データベースを適切に正規化することであることがわかりました。簡単なソリューションを実装する方が迅速でした。そのアプリケーションの概念実証を、あまり時間をかけずにすばやく実行したかったのです。
私の状況では、節約された時間と単純なコードはそれだけの価値があると思いました。これは防御可能な設計上の選択ですか、それとも最初から正規化する必要がありますか?
もう少しコンテキストとして、これは、共有フォルダーに保存されていたExcelファイルを本質的に置き換える小さな内部アプリケーションです。プログラムをクリーンアップして、より保守しやすくすることを考えているので、私も質問しています。そこには私が完全に満足していないことがいくつかありますが、そのうちの1つがこの質問のトピックです。
mysql - 不要な正規化
私の友人と私はウェブサイトを構築していて、大きな意見の相違があります。このサイトの中核は、「人」に関するコメントのデータベースです。基本的にはコメントを入力でき、コメントの対象者を入力できます。次に、視聴者は、コメントまたは人物名の一部に含まれる単語をデータベースで検索できます。完全にユーザー生成です。たとえば、ある人の名前のつづりを間違えたバージョンについてコメントを投稿したい人がいる場合、それは可能であり、それは問題ありません。そのため、複数の異なるエントリ (ミドル ネーム、ニックネーム、スペルミスなど) としてリストされている異なる人物のスペルが複数ある場合がありますが、これはすべて問題ありません。人々がランダムな人や架空の人についてコメントするかどうかは気にしません.
とにかく、問題はデータベースをどのように構築しているかです。現時点では、コメント ID を主キーとする 1 つのテーブルだけで、コメントの対象となる「人物」のフィールドがあります。
コメントID - コメント - 人物
1 - 「彼は変だ」 - ジョン・スミス
2 - 「臭い女の子」 - ジェニー
3 - 「ゲイ」 - ジョン・スミス
4 - 「20ドル貸して」 - Jennyyyyyyyyy
すべてが正常に機能しています。データベースを使用して、特定の「人物」に対するすべての「コメント」を一覧表示するページを作成できます。しかし、彼はデータベースが正規化されていないことに執着しています。私はノーマライゼーションについて読み、彼が間違っていることを知りました。コメント ID は一意であり、「コメント」と「人」を指示するため、テーブルは現在正規化されています。今、彼は「物」であるため、「人」は自分のテーブルを持つべきだと主張しています。「人」は実際にはより大きなコンテナですが(1人の「人」はそれらについて多くの「コメント」を持つことができます)、データベースは「人」が属性であると問題なく動作するようですコメントID。さまざまな SQL 選択に対してさまざまな PHP 呼び出しを使用して、魔法のように出力がより洗練されたように見えるようにし、ユーザーが検索して結果を表示できるようにしますが、実際には、セットアップは非常に簡単です。私は現在、ユーザーに親指と親指でコメントをランク付けさせており、同じテーブルの別のフィールドとして「スコア」を保持しています。
「人」には独自の「スコア」や独自の属性がないため、現在、一意の「人」エントリ用に別のテーブルを用意する必要はないと思います。コメントのみが行います。私の友人はとてもしつこいので、効率のために必要です。最後に私は、「別のテーブルを作成して、'person' を独自のフィールドにする場合、2 番目のフィールドは何にしますか? テーブルに 1 つの列しかない場合、それは無意味に思えるので、同意します。後で 'person' に独自のテーブルを与える必要が生じるかもしれませんが、それなら対処できます。」彼は次に、文字列を主キーにすることはできず、現在のテーブルの「人」を数値に変換すると、その数値が新しい「人」テーブルの主キーになると述べました。私にはこれは不必要に思え、現在のテーブルが読みにくくなります。彼はまた、2 番目のテーブルを後で作成することは不可能であり、後で必要になる可能性があることを予測する必要があると考えています。
誰が正しいですか?
mysql - 非常に単純なデータベースでのデータベースの正規化はどれほど重要ですか?
基本的に 2 種類のデータを持ち、常に 1 対 1 の関係を持つ非常に単純なデータベース (mysql) を作成しています。
イベント
- スポンサー
- 時間(オプション)
- 場所(市、州)
- 会場(任意)
- 詳細URL
スポンサー
- 名前
- URL
都市は頻繁に複製されますが、このような単純なデータベース スキーマに都市テーブルを用意することに本当に価値があるのでしょうか?
データベースは、Web サイトのスクリーンスクレイピングによって作成されます。このサイトでは、都市フィールドはドロップダウンからの選択によって入力されるため、タイプミスなどはなく、レコードを都市テーブルと簡単に一致させることができます。私のデータベースのユーザーが頻繁に都市で検索する場合でも、あまり意味があるかどうかはわかりません.
sql-server - 千行に最適なデータベース設計は何ですか
企業のユーザーを単純に管理するデータベース設計を開始しようとしています。
- 各企業には、ユーザーを管理できる管理領域があります
- 各企業には約 25,000 人のユーザーがいます
- クライアントは、約 50 社の企業が開始できると考えています
私の主な質問は
会社に基づいてテーブルを作成する必要がありますか? お気に入り
users_company_0001
users_company_0002
users_company_0003
...
各企業は「他の」ユーザーを使用することは決してなく、すべての user_company で異なるテーブルを合計/カウントする必要はありません(単純なものでうまくいきJOIN
ますが、より高価(時間)ですが、メインの画像を持つように機能します。これは決して必要とされる。
またはusers
、 (50 x 25000) 1 250 000ユーザー (および増加中)を持つテーブルを作成する必要があります。
最初のオプションについて考えていますが、そのようなレイアウトで Entity Framework をどのように使用すればよいかわかりません...おそらく 90 年代に戻って、データ ロジック レイヤーを手動で生成する必要があります。
会社IDを含むストアプロシージャへの単純な呼び出しになりますか
何を提案しますか?
システム アプリケーションはASP.NETになります(おそらく MVC です。Scott Hanselman の MVC ビデオを見ましたが、Web フォームに関するすべての知識があるため、まだこれを理解しようとしていますが、継ぎ目は簡単です。しかし、それほど簡単ではないことはわかっています。問題が発生する可能性があり、それらを修正するにはさらに時間がかかります)、さらにMicrosoft SQL .
oracle - テーブルの正規化: 一連の行で一意の列を見つける (Oracle 10.x)
次の構造のテーブルがあります。
ご覧のとおり、これは非正規化されたテーブルであり、Worker と Person (および 1 つの Person の多くのバージョン) の両方のデータを 1 つのテーブルに保持します。私の願いはそのテーブルを正規化することですが、テーブルには大量のデータ (多数の列) が含まれているため、どの列を Workers テーブルに、どの列を Persons テーブルに移動する必要があるかを確認する必要があります。結果は次のようになります。
そのためには、すべての一意の Person (WorkerPersons の PersonID で区切られている) で Person の範囲が異なるデータを分析する必要があります。例えば:
この場合、PersonA には 3 つのバージョンがあり、PersonB には 2 つのバージョンがあります。Column1 の値は Person のすべてのバージョンで常に同じであり、その列をテーブル Worker に移動できます。ただし、Column 2 と Column3 の値は Person のバージョンが異なると変化するため、これらの値は Person テーブルに移動する必要があります。
想像もつきませんが、このような正規化が必要なテーブルが約 10 個あり、それぞれに約 40 列あります。各テーブルには、約 500k から 5m の行が保持されます。
どの列をどこに移動するかを分析するのに役立つスクリプトが必要です。テーブル全体で一意の Person の範囲で変化するすべての列を出力するスクリプトが必要です。しかし、それを行う方法はわかりません。次の行と比較するためにLAG分析機能を試しましたが、変更された列をどのように出力するかは私にはわかりません。
お知らせ下さい。
よろしくお願いします、 アンドリュー
database - データの正規化とは
重複の可能性:
データベースの正規化は正確には何をしますか?
誰かがデータの正規化を明確にしてもらえますか? さまざまなレベルとは何ですか? いつ「非正規化」する必要がありますか? 過正規化できますか? 何百万ものレコードを含むテーブルがあり、それを過度に正規化したと思いますが、よくわかりません。
database - データベースの正規化の例
いくつかの例を参考にして、データベースの正規化について学ぶことを楽しみにしています。
簡単に言えば、例を挙げて正規形について誰かに学ばせるにはどうすればよいですか。
オンラインでいくつかの記事を探しましたが、あまり役に立ちませんでした
database - 機能依存と正規化
機能依存性と正規化を研究するための優れたリソースを見つけようとしています。
誰が私がどこを見ればいいのか知っていますか? FD が 1NF、2NF、または 3NF のいずれにあるかを区別するのが困難ですか?
私はウィキペディアを読んでいて、Google 検索を使用して優れた研究を見つけましたが、それを簡単な言葉で説明しているものは見つかりません。
FDとノーマライゼーションを人生でどのように学んだか、皆さんも共有できるかもしれません。
sql - リレーショナルデータベースの設計(多対多のマッピングの正規化)
以下は、私が直面している設計の質問に類似した(そして単純化された)例です。
生徒、クラス、成績があるとします。学生は多くの異なるクラスに参加することができます。各クラスには多くの異なる生徒がいます。そして、すべての(学生、クラス)ペアには1つの成績があります。
データベース(mysqlデータベース)を次のようにレイアウトする必要があります:
オプション1)
オプション2)
それとも他のものとして設計する必要がありますか?オプション2は現在は単純に見えますが、将来的には、各(student_id、class_id)ペアに関連する他の統計が必要になる可能性があります(この場合、オプション1は少し良いように見えますか?オプション1はまだ少し複雑に感じます)。
おすすめは何ですか?ありがとう。
relational-database - このテーブルは 2NF ですか?
データベースの正規化について学ぼうとして、次の表に戸惑いました。
私が使用している本は、これを 1NF のテーブルの例として示しています。しかし、Wikipedia の 1NF、2NF、および 3NF の記事を読んだ後、少し混乱しました。
私が知る限り、このテーブルには {Name,Organisms} と {Date,Organisms} の 2 つの候補キーがあります。ウィキペディアによると (リンク テキスト):
1NF テーブルは、すべての非素数属性がすべての候補キー全体に機能的に依存している場合にのみ、2NF になります。(非プライム属性とは、どの候補キーにも属さない属性です。)
「非プライム属性」のこの定義により、すべてのフィールドが2つの候補キーの少なくとも1つに属しているため、このテーブルには非プライム属性がないように思えます。非プライム属性がない場合、(このテーブルは 1NF にあるため) Wikipedia の定義により、このテーブルは 2NF にあるように見えます。
しかし、このテーブルは設計が悪く、更新エラーが発生しやすいことを認識しているため、どこかでロジックを間違えているに違いないと思います。 この表がどの正規形であるか、および/または私の推論がどこに誤りがあるかを誰かが説明できれば、大いに感謝します.