2017-04-24 6 views
0

データベースにデータを保存する方法を決定しようとしています。属性とデータベース:数値または英数字のストア値

テーブルタイプは、それが私のモデル(整数、実数、英数字など)

表内の既存のすべての種類を格納し、多かれ少なかれ列挙型のようなものです入力します(SQLiteの) は、我々は2つのテーブルがあるとしましょう属性には属性が含まれており、レコードは次のようになります。

Attribute : 
id : its id 
name : name of the attribute 
value : ??? (the main question here) 
type : foreign key to table type 

したがって、属性のタイプは整数、実数または英数字です。タイプに応じて属性の値を格納する方法を知りません。

私がこれまでに3ソリューションと考えられてきた

解決方法1:属性の「値」フィールドはString型であると私は、関連するタイプに変換するprogrammaticaly

解決策2:私はより多くを作成します」 valueValue、intValue、realValue、alphanValueのような型の値を持っていて、型に応じて無関係なフィールドにNULLを入れてください。

解決策3:関連する属性の外部キーを持つIntValue、RealValue、AlphaNValueという3つのテーブルをさらに3つ作成します。

私は、パフォーマンスと一貫性の面でどのソリューションが優れているのか、考えていない別の関連するソリューションがあるかどうかを知りたいと思います。

ありがとうございます

答えて

0

あなたの質問にはMySQLという名前が付けられていますが、SQLLiteについて言えば、正しくラベル付けして他の人に役立ちます!

解決策のようなEntity-Attribute-Valueを実装しているようです。このコンセプトについて多くの議論があります - thisが最も便利です。

EAVの一般的な批判の1つは、あなたが求めている質問です。データを適切なデータ型に格納するのは難しいです。

あなたがやっていることなら、EAVの代替品を見てください。通常、「柔軟性」にはそれほど価値のない多くの欠点があります。特にSQLLiteのような制約の厳しい環境では

これは現実的ではない場合は、オプション1に行きます。ペイントするすべてのオプションで、アプリケーションはデータベース外で作業する必要があり、オプション1は最も簡単です。シンプルはいつもより良いです!

+0

こんにちはNeville。ええ、あなたの答えとw01fを考えれば、解決策1が私のために行く方法だと思われます。今すぐあなたのリンクを見てみましょう、あなたの時間のために多くのおかげで – SivaDashq

0

私はこう言っています。それは簡単です。 SQLiteはテーブルを結合するために高速ではなく、完全なDBMSでもありません。だから一般的に少ないテーブルでうまくいく。

理由がわかりにくい場合は、理由がわかりません。たぶんあなたがあなたの場合にもっと複雑な道を行く理由を説明してください。

+0

私はこのような状況で何が普通の方法であるのだろうと思っていました。 SQliteがテーブルを結合するのに最適ではないことを指摘するのは間違いありません。これを考慮して、私はおそらく解決策1または2に行くでしょう。 – SivaDashq