3

1つのテーブルに5つのブール値を格納する必要があります。各値はtinyint(4)として保存できます。したがって、5つのtinyint(4)があります。1つのtinyint(4)に5つのブール値を入れることを考えています。誰もが私よりもよく知っていると思います。5ビットを1バイトに問題なく保存できます:)最初の値は0(false)または1(true)として、2番目の値は0(false)または2( true)、3番目は0または4、4番目は0または8、5番目は0または16です。したがって、その値の合計をtinyint(4)に格納すると、5つのブール値が正確にわかります。

    For example, stored 21 -> 16 + 4+1.
So, if 21 is stored, we know that:
    Fifth=true
    Fourth=false
    Third=true
    Second=false
    First=true.

私の質問は、1つの変数だけを保持することは意味がありますか?dbボリューム(バイト)とパフォーマンス(4列少ないが、同じテーブルで実際にvarchar(1000)を使用したのに対し、これは4バイトのみ)を獲得しますが、毎回「合計」から適切なブール値を「抽出」する必要があります。 「php関数を使用すると、それは頻繁に発生します(たとえば、ユーザーがボタンを押したとき)。ブール値を合計として1列に格納するのは理にかなっているので、11列ではなく7列になりますか?

その値は明らかです(テーブルには2行よりもはるかに多くの行があるため)、キーではありません。

ありがとうございました。

4

3 に答える 3

6

値が単一の「不透明な」外部データ型(フラグの Enum など) でない限り、これを行わないでください -クエリで使用されるか、前述の「不透明な」外部で使用される場合type: 不連続/個別のフィールドを使用します。(jmucchielloとMarkRが回答で指摘したように、正しいタイプです。)

ここで「パフォーマンスのために」試してみると、後でデータベースを「修正」するか、醜いスキームを回避する必要があるときに、データベース、特にこのデータベースを嫌うようになります。(パフォーマンスの問題がある場合は、それを知っているでしょう...そして、質問する前にパフォーマンス分析を実行するのに十分な知識があります。) Donald Knuth は、物事の 97% がただ重要ではないことを指摘したとき、正しかったです。ですから、きれいにして、データベースがやりたいようにやらせてください。

ハッピーコーディング。


上記のアニメーションのように聞こえる場合は、他の人が自分と同じ過ちを避けるのを助けようとしているからです終わりに遭遇:-)

于 2011-12-17T07:01:54.300 に答える
2

いいえ、意味がありません。

それぞれを独自の列に格納するか、内部的にビットフィールドを使用する MySQL 固有の SET 型を使用しますが、より人間が判読できます。

行ごとに数バイトを心配することは、本当に悪い考えです。これは信じられないほど時期尚早な最適化のケースです。

于 2011-12-17T07:40:25.203 に答える
1

BIT タイプを使用して、MySQL にスペースの最適化を心配させてみませんか?

于 2011-12-17T07:03:42.830 に答える