web-dev-qa-db-ja.com

すべてのデータ型の列またはすべてを格納する1つの列が必要ですか

現在、次のようなデータベーステーブルがあります。

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つの別々の列に置き換える必要がありますTextValueDecimalValueIntegerValue、および- BitValue

データ型は、関連するものに設定されます。これは、これら4つの列のすべての行3がNULLになることを意味します。

1
user1786107

この質問は(さまざまな形で)定期的に発生します。このタイプの「ソリューション」は [〜#〜] eav [〜#〜] (Entity-Attribute-Value)として知られており、not良い考えです。それが引き起こす可能性のある問題に関するヒント(またはヒントへのリンク)と、RDBMSが提供するデータ型を適切に活用する方法については、 ここ または ここ をご覧ください。

正しいデータ型を使用しないことは、 query optimiser を混乱させ、システムの速度を低下させる確実な方法です。 Joe Celko はSQLのすべての問題で世界的に有名な専門家であり、彼の意見は注目に値します。

彼がこのシステムを説明するために頭字語「MUCK」(*)を使用しているという事実は、あなたが知る必要があるすべてを教えてくれるはずです:-)

(*)大規模に統合されたコードキー

8
Vérace

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;
4
Leigh Riffel

ユーザーが独自の「フォーム」/「画面」/「ページ」を作成できる柔軟なアプリケーションを作成しようとしている場合は、モジュールの特定の意味のあるテーブル名と、の特定の意味のあるラベル付き列を使用して、さまざまな「モジュール」を作成することをお勧めします。テーブルではなく各フィールドに、何でも何でもできるフィールドを格納します。

現在の設計では、非常に遅いアプリケーションを作成し、レポート目的でデータを取得することも面倒になります。

ユーザーが「モジュール」を選択し、そのモジュールから特定のフィールドのセットを選択してページを作成できるようにします。

もう少し管理作業のために柔軟性を犠牲にしますが、それだけの価値はあります。

2

それはあなたが「価値」で何をしたいかによります。たとえばsum(...)が必要な場合は、10進数の列を作成し、「case when fieldtype = 'N' then sum(cDecimal)When ..」を使用するのが最適な場合があります。

0
Pedro Faro