2

データベース構造の最適化に問題があります。私はそれを正確に説明しようとします。

さまざまな値を追加できるプロジェクトを作成しますが、この値にはデータベース内の異なる型の列が必要です (例: int、double、varchar)。さまざまな種類の値をデータベースに格納する最良の方法は何ですか。プロジェクトでは Propel 1.6 を使用しています。ポイントは、「int」、「varchar」、およびその他の列タイプで値を追加できることです。テーブルを検索するのは効率的でした。

合計で、2 つのアイデアがあります。1 つ目は、「id」、「value_int」、「value_double」、「value_varchar」などの列を持つ「値」のテーブルを作成することです。対応する列タイプを使用します。値のタイプに応じて、レコードは適切な列の値とともに保存されます (残りは NULL になります)。

2 番目の解決策は、"value_int"、"value_varchar" などの個別のテーブルを作成することです。"id"、"value" という列があり、関連する "value" の型 (つまり、int、varchar など) に対応します。など)。

上記の解決策のいずれも信じていないことを認めなければなりません。もともと、列が「テキスト」タイプになる1つのテーブル「値」について考えていましたが、この解決策はおそらくさらに悪いでしょう。

このトピックに関するあなたの意見を知りたいのですが、おそらく他のものが良いでしょう。前もって感謝します。

編集: 例:

3 つのテーブルがあります。

USER: [ユーザーのテーブル] * ID * 名前

FIELD: [プロファイル フィールドの表 - 列「タイプ」はフィールドのタイプです。例: int または varchar) * id * タイプ * 名前

値: * id * User_id - (FK user.id) * Field_id - (FK field.id) * 値

したがって、各行には USER テーブルのユーザーがあり、プロファイルは VALUE テーブルに保存されます。各プロファイル フィールドには異なるタイプ (FIELD テーブルの列「タイプ」) がある可能性があり、それに基づいて、この値を適切なタイプの適切な列に追加する必要があります。

4

1 に答える 1

1

最初のオプションを使用しましたが、問題なく動作します。つまり、型ごとに列があり、型を指定する別の列があります。

プロの:

  • 読みやすく、フィルタリングしやすい (結合なし、行の単純な SELECT のみ)

CONの:

  • 行はより多くのスペースを必要とします

したがって、超最適化が必要ない場合は、この方法を使用します。

別のオプションとして、何らかの方法で値を NVARCHAR(MAX) フィールドにシリアル化することもできます (例: "TEXT: SampleText" または "INT: 8")。しかし、そうすると、たとえば日付や数値の範囲など、データベースでうまく検索できなくなります。

于 2013-11-13T15:51:58.470 に答える