なぜフラグ/列挙型を整数ではなく文字列としてデータベースに保存するのですか?


29

Drupal 7、Wordpress(非常に古いバージョン)、Pythonベースのカスタムアプリケーションなど、いくつかの有名なCMSのSQLダンプを参照しています。

これらのすべてのダンプには、整数の代わりに文字列フラグを持つデータが含まれていました。例えば、ポストの状態は次のように表現されたpublishedclosedまたはinheritよりむしろ12または3

データベースの設計の経験はかなり限られており、単純なSQLを使用したことは一度もありませんが、このようなデータには数値/整数フラグを使用する必要があることを常に教えられました。tinyintたとえば、データベース内で消費するスペースがの場合よりもはるかに少ないことは明らかですvarchar(9)

だから私は何が欠けていますか?これはデータストレージとデータの冗長性の浪費ではありませんか?これらの列が文字列ではなく整数を使用している場合、ブラウジング、検索、およびインデックス作成が少し速くなりませんか?


7
ダンプの文字列のように見えるdev.mysql.com/doc/refman/5.0/en/enum.htmlを実際に使用していないのは確かですか。いずれにせよ、私は最近、それはほとんどマイクロ最適化としてカウントされると思います。
エスベンスコフペダーセン


2
この質問は基本的に権威への訴えです。
DeadMG

3
完全な答えではありませんが、...スクリプト言語Luaを知っていますか?ダイレクトで高性能であることで有名で、ゲームエンジン全体を書くのに使用されますか?驚いたことに...彼らは決して数値型を持つことを気にしませんでした。それらの文字列処理コードは非常に効果的であり、時間に敏感なゲームエンジンコードで実際に文字列である数字を加算できます。JavaScriptのように、オブジェクトさえも持っていません-非常に派手なハッシュテーブルです。「膨大な数のchars?どれだけ非効率的!」というCプログラマーの見解 2015
。– Katana314

2
intではなく文字列を使用することに関する質問は、それらの「権限」に関するものでない限り、完全にトピックに該当するため、「権限へのアピール」部分を削除して再投票するように編集されました。
Ixrec

回答:


45

はい、数字の代わりに文字列を保存すると、より多くのスペースを使用できます。とにかく有名なプラットフォームがそれを行っている理由は、そのソリューションの利点がコストよりも大きいと考えるからです。

利点は何ですか?データベースダンプを簡単に読み取って、enumテーブルを記憶せずにその内容を理解できます。また、半公式のGUIでも、取得したレコードを変換するのではなく、単にテーマの値を使用する場合があります。(これは、ディスク容量/処理時間のトレードオフの基本的な形式です。)

費用はどうですか?ディスクが非常に大きく、安価になったため、CMSのデータストレージ容量は長い間ボトルネックではありませんでした。一方、プログラマーの時間は通常より高価になります。したがって、ビジネスの観点からは、開発の労力をディスク領域と引き換えにすることも良いことです。


7

はい、yesまたはのようなものを保存するとtrue、tinyintよりも多くのスペースが必要になります。これは驚くべきことではありません。また、索引付けが行われるため、データベースの結合の効率が低下します。また、正しい値(yesvs y)が混乱する可能性があるというペナルティもあります。

ただし、データベース(特にMySQL)に文字列を保存するのに似た、効率的なアプローチが多数あります。

まず、MySQLにはenumタイプ(docs)があり、その方法で設定すると、ブール値または制限された文字列セットに非常によく似ています。また、有効な値のみが入力されるようにします。これは、を保存するよりもはるかに便利な場合が多く12または情報が意味を伝える3ための値としても役立ちます。列挙型には、型を追加または削除するためにスキーマを変更する必要があるというペナルティが伴います。

これにより、子テーブルと外部キー(すべてのデータベースに適用可能)が表示されます。はい、あなたはキー(に戻っていくつかの値を格納している12または3)との値publishedclosedおよびinherit別のテーブルに格納されています。ビュー(docs)を使用すると、テーブルがキーではなく文字列を含むように見せることができます。これには、子テーブルのエントリを追加または削除するためにスキーマを変更する必要がないという利点があります。

正確にどのように保存されるかは、スキーマの実際のDDLを調べて、使用されるメソッドを決定し、選択したトレードオフのヒントを得る必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.