2012-03-19 11 views
1

私は300.000以上のレコードを持つテーブルを持っています。大きなテーブルに列を追加する:データ型またはINTまたは参照テーブル?

私は、レコードの少しの部分にいくつかの「マーカー」(0.5%以下)を追加したいです。

最良の選択となるか:

  • INTフィールドを使用してバイナリ文字列のように扱う

    マーカー0:xxxxx1は、1として保存されます

    マーカー0と3:xx1001はECC ..

  • はSETデータ型を使用して、9のように格納される

    参照表を使用して結合します。何かのように

    mydata:id | ..

    マーカー:id |マーカー

    mydata_marker:mydata_id |

  • をmarkers_id私は変化に最初のオプション「かわいい」と、実装が簡単で、おそらく問題を見つける他のフィールド(Iはゼロでテーブルを埋めるのアイデアを好きではありません)

を追加します。しばらく経って。

私はそのデータ型を使用したことがないので、2番目のオプションについてコメントする方法はわかりません。私は第三の選択肢のために行くだろう推測...

任意のアドバイスはありますか?

答えて

2

あなたは、レコードの0.5%のみがすべてで任意のマーカーを持つことになりますと言う考えると、あなたは自分の子テーブルにマーカーをオフに分割したほうが良いと思います。一度あなたがその子テーブルを持っていれば、ほとんどのスペースを無駄にすることなく、int、リテラルmysql bit field、個々のフラグフィールドなどを使用することができます。

8つのフラグしかないと仮定すると、tinyintフィールド(1バイト)が必要です。それは〜290kbytesのストレージを無駄にするでしょう。それを独自の子テーブルに分けて、新しいテーブルには少しオーバーヘッドがあり、個々のフラグレコードには〜10kのストレージがあります。

2

それが起こっているかを把握するために外部の処理または醜いクエリを必要とし、それはこれらのマーカーは、後で痛みをどのように機能するかを変更することになりますので、私は完全に最初のオプションを避けるだろう。

私は番目のオプションを使用します。あなたはそれらの(少なくともidとname)とhas_markerまたは類似した何かのためのテーブルに添付されているどんな情報でマーカーのテーブルを作ります。 has_markerには、既存のレコードの主キーと、追加するマーカーの主キーが必要です。データモデルに適合する場合は、一意の外部キー(record_id、marker_id)をインクルードし、両方の列をコードでインデックス化することで、両方の列のインデックスを高速化することを検討してください。

これは少し大きすぎるかもしれませんが、実装と将来の変更の自由度が最も高くなります。また、データベースのすべてのデータをデータベースに保存する代わりに、 '9'や '1001010101'や他の同様のシステムで使用されるマーカーを解釈する必要はなく、両方の方向から簡単に照会することができます(どのマーカー単純な結合で、このレコードには/これらのマーカーがどのレコードにあるか)最後に、このメソッドで完全に新しいマーカーを追加するのは簡単です - マーカーテーブルで新しい行を作成し、それを持つ必要があるレコードごとにhas_markerに追加します。

関連する問題