次の 2 つのテーブルを用意することをお勧めします。
書店:
id
name
someMoreColumns
本:
id
bookStore_id
title
isbn
date
publisher
format
size
someMoreColumns
ここで関係を確認するのは簡単です: a bookStore
has many books
.
BookStore
一部のテーブルの一部の行に一部の列の値がない場合でも、すべてのテーブルにあるすべての列を 1 つのテーブルに配置していることに注意してください。
私がこの方法を好む理由:
1) テーブルのすべてのデータに対して、テーブルに値が含まれないBookStore
列はごくわずかです(例として、電子書籍版がない場合)。他の列はいつか埋めることができます (電子書籍に a を設定できますが、電子書籍を参照しているように見えるこの列が表にありません)。このようにして、いつか更新したい場合に、すべての本からより詳細な情報を得ることができます。books
size
format
date
BookStore_Bar
2) テーブルがたくさんある場合BookStore
、たとえば 12 の場合、データを簡単に処理することはできません。私が言いたいのは、すべての本 (つまりすべてのテーブル) に対して何らかのクエリを実行したい場合、少なくとも 3 つの方法があるということです。
まず、12 個のテーブルのそれぞれに対して手動でクエリを実行し、データをマージします。
2 番目:FROM
句に12 個の結合を含むクエリを作成するか、12 個のテーブルを設定して、すべてのデータをクエリします。
3 番目: スクリプト、ストアド プロシージャ、またはソフトウェアに依存して、先ほど述べた最初または 2 番目の方法を実行します。
本当に必要でない限り、他のスクリプトやソフトウェアに依存せずに、できるだけ簡単にデータを処理できるようにしたいと考えています。
3)MySQLの時点で(私はMySQLについてもっと知っているため)partitions
、テーブルで使用できますbooks
。これは高レベルのデータ管理であり、通常はテーブルが割り当てられるため、テーブルのデータをディスク上の 1 つだけではなく複数のファイルに分散できます。同じテーブルで大量のデータを処理する場合に非常に便利で、データ分散計画に基づいてクエリを高速化します。例を見てみましょう:
既に 12 の個別の本屋があるとしますが、私のデータベース モデルではそうです。テーブルの行ごとbooks
に、12 の bookStore の 1 つに関連付けられます。データを でパーティション分割するbookStore_id
と、12 個のテーブルがあった場合とほぼ同じになります。これは、それぞれに対してパーティションを作成できるため、bookStore_id
各パーティションは関連データ ( に一致するデータ) のみを処理するためbookStore_id
です。
(1, 4, 9)のテーブルbooks
にクエリを実行するとします。bookStore_id
必要な出力を得るためにクエリで本当にこれら 3 つのパーティションが必要な場合、他のパーティションはクエリされず、分離された各テーブルをクエリするのと同じくらい高速になります。
パーティションを削除しても、他のパーティションは影響を受けません。新しいパーティションを追加して、新しいブックストアを処理できます。パーティションをサブパーティション化できます。2 つのパーティションをマージできます。簡単に言えば、シングルテーブルbooks
を扱いやすいマルチ収納テーブルに変えることができます。
副作用:
1) 私はテーブルの分割をすべて知っているわけではないので、ドキュメントを参照して、それを作成および管理するためのすべての重要なポイントを学ぶことをお勧めします。
2) テーブルのデータが非常に多い可能性があるため、定期的なバックアップ (ダンプ) でデータを管理してくださいbooks
。
お役に立てば幸いです。