[解決済み] MySQL: 複数のテーブル、または多くのカラムを持つ1つのテーブル?
質問
これはデザイン的な質問ですね。
主キーが1つあって(たとえばユーザーのID)、そのユーザーに関連する情報が大量にあるんです。
それとも、1つのテーブルで多くのカラムを持つべきでしょうか?
以前は、アプリケーションの使用データ用のテーブル、プロファイル情報用のテーブル、バックエンドトークン用のテーブルなど、複数のテーブルを用意して、整理整頓していました。
最近、ある人から「そういうやり方はしないほうがいい」「カラムがたくさんあるテーブルがあってもいい」と言われたんです。しかし、これらのカラムはすべて同じ主キーを持っています。
私はデータベース設計の経験が浅いので、どの方法が良いのか、また長所と短所は何でしょうか?
従来のやり方はどうだったのか?
どのように解決するのですか?
情報が1対1(各ユーザーが1つの名前とパスワードを持っている)であれば、1つのテーブルにした方が良いでしょう。なぜなら、結果を取得するためにデータベースが行う必要のある結合の回数が減るからです。データベースによっては、1つのテーブルのカラム数に制限がある場合もあるようですが、通常の場合は気にする必要はありませんし、必要であればいつでも後で分割することができます。
データが一対多の場合(各ユーザーが何千行もの使用情報を持っている)、重複データを減らすために別々のテーブルに分割すべきです(重複データはストレージスペース、キャッシュスペースを浪費し、データベースの保守を困難にします)。
のウィキペディアの記事が参考になるかもしれません。 データベース正規化 この理由については、詳しく述べられているので、興味深い。
データベースの正規化とは、リレーショナルデータベースのフィールドとテーブルを整理し、冗長性と依存性を最小限に抑えるプロセスです。通常、正規化には、大きなテーブルをより小さな(冗長性の少ない)テーブルに分割し、テーブル間の関係を定義することが含まれます。その目的は、データを分離して、フィールドの追加、削除、変更を 1 つのテーブルで行い、定義された関係を介してデータベースの残りの部分に伝搬できるようにすることです。
非正規化 というのも、データを繰り返す方が良い場合があるからです(データを読み込む際のデータベースの作業量を減らすことができるからです)。最初はできるだけデータを正規化し、特定のクエリでパフォーマンスの問題を認識した場合のみ、非正規化することを強くお勧めします。
関連
-
MySQLインストールチュートリアル(Linux版
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み] MySQL エラー: キーの長さがないキー指定
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?
-
[解決済み] CSVファイルをMySQLのテーブルにインポートするには?
-
[解決済み】多言語データベースのためのスキーマ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLデータベース・インデックスの左端一致の原則
-
MySQLのLike演算子に関する詳細
-
MySQLインストールチュートリアル(Windows用)詳細
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み] 親の行を削除または更新できない:外部キー制約が失敗する
-
MySQLにおけるvarchar型とchar型の違い
-
sql エラーを解決する オペランドには1つの列が含まれている必要があります。
-
SQL Server のトランザクションは、try キャッチに記述しなければ、中間ステートメントがエラーを報告してもコミットされます。
-
Mysqlの使用中に発生したエラーの一部