2017-03-11 12 views
2

データ型をデータベースに格納する際のベストプラクティスとは何でしょうか?文字列とデータ格納用の整数

たとえば、チケットが次のステータス(open,closedreview)を持つことができるサポートチケット機能があります。

文字列として保存しますか?

+----+----------------+--------+ 
| id |  ticket  | status | 
+----+----------------+--------+ 
| 1 | example ticket | open | 
| 2 | example ticket | closed | 
+----+----------------+--------+ 

ストア整数値、そう:1 =>open2 =>closed3 =>review又は文字列として。

+----+--------+ 
| id | status | 
+----+--------+ 
| 1 | 1  | 
| 2 | 2  | 
+----+--------+ 

あなたはその状態の名前を解決するために、あなたは余分なテーブルを作成し、整数として保存したい場合(support_ticket_statesテーブルを言うことができますか)?

+----+----------------+--------+ 
| id |  ticket  | status | 
+----+----------------+--------+ 
| 1 | example ticket | 1  | 
| 2 | example ticket | 2  | 
+----+----------------+--------+ 

それとも、例えば、クライアント側でそれを行うだろう:

最良の選択肢であると考えられる何
if ($ticket->status == 1) { 
    echo 'Open'; 
} 

+1

3つの異なる状態しかない場合は、列挙型が適切です。 Enumをデータベースに格納できますか? – Carcigenicate

+0

列挙型として格納できます。確かに最良の選択肢のように思えますが、答えとして投稿することができますので、解決したことをマークできますか?あなたの素早い返信をありがとう –

+1

通常、可能な状態の数が限られている場合は、Enumに到達する必要があります。そうすれば、無効な値が渡された場合、コンパイル時にキャッチされる可能性があります。マクロを作成しない限り、生のints/stringsはその能力を与えません。私は答えを書くだろうが、私は非常に長い時間PHPやmysqlを使用していない。 – Carcigenicate

答えて

1

をVARCHARがよりクエリが速くなるだろうインデックス作成。

  • firstname:文字列として「Daniel」を保存するか、すべてのユーザーをfirstname_id=1にマッピングしますか?私はマッピングを使用するでしょう。
  • ステータス:新規/オープン、2つのオプションのみですが、ここではマッピングを使用します。
  • 毎時/毎日2つのオプションもありますが、ここでは文字列型を使用します。
  • 私の好み:のエントリに関連する情報であれば - マッピングテーブルを使用してください。 「単一文字列」のままにすることが保証されている場合は、文字列として格納します。上記の例をピッキング

    は:

    • ファーストネームは常に他のユーザーに影響を与えるべきではない名前を変更し、シングル「ファーストネーム」のまま。 - >文字列
    • statusは、 "一般的な応答時間"、 "説明"、 "チームリード"などの詳細情報で拡張することができます... - >マッピング
    • 毎時/毎日:ありますそれ以上のことは言いません。 - >文字列

    if ($ticket->status == 1) { 
        echo 'Open'; 
    } 
    

    これがあれば、あなたが、あなたのローカライズを行う方法によって異なります。 「正しい」と「間違っている」、「ただ働く」と「働かない」ことはありません。 :-)

    データベースにopenclosedという名前を付けておき、ローカライズになるとデータベースクエリではなく「コード」を使って適切に翻訳してください。 (Loacalizationのものを簡単にキャッシュされ、プリロードすることができ、過剰設計されたクエリの必要はありません、あなたはしなかった原因。):

    echo getLocalizedContent($ticket->status, $user->getLanguage()); 
    

    (言語情報はそれほど必要がとして渡さないために、セッションと一緒に保存することができますパラメータ:

    echo getLocalizedContent($ticket->status); 
    
    +0

    まあまあです!私が今やっていることは、 'open'、' closed'、 'review'の値を​​格納するために' enum'を使い、ロケールに基づいて値を変換することです。 Laravels Eloquent Mutatorsで本当にスムーズに動作します。なぜなら、私がTicketモデルを解決するたびに、statusプロパティは実際の値と変換された値の両方を含むオブジェクト(文字列ではなく)になるからです:) –

    -1

    私は、そのアプリケーションの大きさに依存すると思います。アプリケーションが十分な大きさであれば、チケットごとに 'open'、 'close'、 'review'のテーブルを作成する必要があります。データを簡単かつ迅速に取得することができます。

    一方、if条件で処理することができます。

    0

    ストリングとして格納することは、あまりにも多くの短所(たとえば、ストレージの非効率的な使用)です。

    2番目のオプション(整数として格納)が効率的です。ただし、文字列表記を編集可能にする場合は、追加の表のみを使用してください。それ以外の場合は、データベース要求のランタイムを何も延期しません。あなたの例(開いている/閉じている)は、ハードコードされている可能性があり、ランタイムにとってより効率的です。

    さらに小さなデータ型(tinyint、smallintなど)をデータベースで受け入れる場合は、単純に整数ではなく、最も適したデータ型を使用します(あとで数多くの状態を追加する予定がない限り)。データの大きな量に

    0

    、整数を格納し、それらがそれは個人の好みに依存

    関連する問題