2

次の状況で、2つのdbスキーマアプローチのどちらを採用すべきかについて混乱しています。

Webサイトの複数の属性(ページサイズ、単語数、カテゴリなど)を保存する必要があり、属性の数は将来増加する可能性があります。目的は、このテーブルをユーザーに表示することであり、ユーザーはデータ間ですばやくフィルター/並べ替えを実行できる必要があります(したがって、テーブル構造は高速のクエリと並べ替えをサポートする必要があります)。また、変更のタイムラインを維持するために、以前のデータのログを保持したいと思います。したがって、私が考えた2つのテーブル構造オプションは次のとおりです。

オプションA

website_attributes

id、website_id、page_size、word_count、category_id、title_id、......(最大18列になり、null値がいくつかある可能性があり、将来的にさらに列を追加する必要がある可能性があることに注意する必要があります)

website_attributes_change_log

上記と同じテーブル構造に「change_update_time」の列が追加されています

このスキーマの利点は、一部の属性が他のテーブルにリンクされている場合でもクエリを簡単に記述できることと、並べ替えが簡単になることです。後で列を追加することの欠点は、ALTERTABLEが大きなデータテーブルで実行するのに非常に長い時間がかかることで問題になる可能性があります+多くのnull列を持つ多くの行が存在する可能性があります。

オプションB

website_attribute_fields

attribute_id、attribute_name(eg page_size)、attribute_value_type(eg int)

website_attributes

id、website_id、attribute_id、attribute_value、last_update_time

ここでの利点は、いつでも列を追加でき、ストレージスペースを節約できるという点で、このアプローチの柔軟性にあるようです。ただし、このアプローチを採用したいのですが、テーブルを表示する必要がある場合、クエリの記述は特に複雑になると思います[一度に複数のサイトのレコードを表示する必要があり、相互参照もあるためです。特定の属性の他のテーブルとの値の比較]+データの並べ替えは難しい場合があります[これが列ベースのアプローチではない場合]。

私が見ているもののサンプル出力は次のようになります。

Site-A.com、232032バイト、232ワード、PR 4、不動産[カテゴリテーブルにリンク]、..

サイト-B.com、...、...、...、..。

また、ユーザーはすべての数値ベースの列で並べ替えることができる必要があります。その場合、アプローチBは難しい場合があります。

ですから、私はオプションAを使用して正しいことをしているのか、それともそもそも考えもしなかったかもしれない他のより良いオプションがあるのか​​を知りたいのです。

4

5 に答える 5

2

オプションAの使用をお勧めします。

pt-online-schema-changeを使用すると、長時間実行されるALTERTABLEの問題を軽減できます。

今後のMySQL5.6は、ノンブロッキングのALTERTABLE操作をサポートします。

オプションBは、Entity-Attribute-ValueまたはEAVと呼ばれます。これはリレーショナルデータベースの設計規則に違反するため、この形式のデータに対してSQLクエリを作成するのは厄介です。あなたはおそらくそれを使用したことを後悔するでしょう。

私はEAVの落とし穴を説明するStackOverflowに数回投稿しました。
私のブログにもあります:EAVFAIL

于 2012-12-05T07:40:03.490 に答える
0

オプションAの方が適していますが、列を追加するためのアラートテーブルの場合は時間がかかる場合がありますが、オプションのクエリと並べ替えの方が高速です。私は以前にオプションAのようなデザインを使用しましたが、何百万ものレコードがテーブルにある間、アラートテーブルを作成するのにそれほど時間はかかりません。

于 2012-12-05T07:18:27.813 に答える
0

オプション2は柔軟性が高く、RAMの使用量が少ないため、オプション2を使用する必要があります。option1を使用している場合は、RAMに大量のコンテンツをフェッチする必要があるため、ページフォールトの可能性が高くなります。データベースのクエリ時間を増やしたい場合は、データベースに反抗的にインデックスを付けて、迅速な結果を得る必要があります。

于 2012-12-05T07:24:47.963 に答える
0

オプションAは良いデザインではないと思います。優れたデータモデルを設計するときは、将来的にテーブルを変更しないでください。SQL言語をドメイン化する場合、オプションBでクエリを使用することは難しくありません。また、それはあなたの本当の問題の解決策です:「あなたはいくつかのウェブページのいくつかの属性(最終的な属性ではなくオープンナンバー)を保存する必要があります、したがってそれらの属性を表現するためのエンティティが存在します」

于 2012-12-05T07:58:11.433 に答える
-1

属性が固定されているため、オプションAを使用します。複数の属性に基づくクエリが存在するため、2番目のモデルからのデータのクエリと処理は困難になります。

于 2012-12-05T08:19:54.660 に答える