現在、次のようなデータベーステーブルがあります。
PageField
-Id (Int, PK)
-FieldType (String) Can be Text, Decimal, Integer or Bit
-Value (This stores the value regardless of the FieldType, so it is not strongly typed)
Value列を削除し、4つの別々の列に置き換える必要がありますTextValue、DecimalValue、IntegerValue、および- BitValue?
データ型は、関連するものに設定されます。これは、これら4つの列のすべての行3がNULL
になることを意味します。
この質問は(さまざまな形で)定期的に発生します。このタイプの「ソリューション」は [〜#〜] eav [〜#〜] (Entity-Attribute-Value)として知られており、not良い考えです。それが引き起こす可能性のある問題に関するヒント(またはヒントへのリンク)と、RDBMSが提供するデータ型を適切に活用する方法については、 ここ または ここ をご覧ください。
正しいデータ型を使用しないことは、 query optimiser を混乱させ、システムの速度を低下させる確実な方法です。 Joe Celko はSQLのすべての問題で世界的に有名な専門家であり、彼の意見は注目に値します。
彼がこのシステムを説明するために頭字語「MUCK」(*)を使用しているという事実は、あなたが知る必要があるすべてを教えてくれるはずです:-)
(*)大規模に統合されたコードキー
Vérace(+1)からの正解に少しだけ追加するには、さまざまなタイプをさまざまな列に分割するだけでなく、列が何であるかを定義して適切に使用する必要があります。これは設計と呼ばれ、理解しやすく、スケーラブルで、パフォーマンスの高いシステムに必要なステップです。
理解できる角度を打つために、これを比較してください:
SELECT
(SELECT Value FROM PageField WHERE ID=1 AND FieldType='Integer'),
(SELECT Value FROM PageField WHERE ID=1 AND FieldType='Float'),
(SELECT Value FROM PageField WHERE ID=1 AND FieldType='String')
FROM dual;
これとともに:
SELECT IntegerValue, FloatValue, TextValue FROM PageField WHERE ID=1;
これとともに:
SELECT Length, Cost, Fabric FROM Patterns WHERE ID=1;
ユーザーが独自の「フォーム」/「画面」/「ページ」を作成できる柔軟なアプリケーションを作成しようとしている場合は、モジュールの特定の意味のあるテーブル名と、の特定の意味のあるラベル付き列を使用して、さまざまな「モジュール」を作成することをお勧めします。テーブルではなく各フィールドに、何でも何でもできるフィールドを格納します。
現在の設計では、非常に遅いアプリケーションを作成し、レポート目的でデータを取得することも面倒になります。
ユーザーが「モジュール」を選択し、そのモジュールから特定のフィールドのセットを選択してページを作成できるようにします。
もう少し管理作業のために柔軟性を犠牲にしますが、それだけの価値はあります。
それはあなたが「価値」で何をしたいかによります。たとえばsum(...)が必要な場合は、10進数の列を作成し、「case when fieldtype = 'N' then sum(cDecimal)When ..」を使用するのが最適な場合があります。