2

document - key - valueSQLite データベースに大量 (50,000 行以上) を保存する必要があります。私の懸念は、これらの値はテキストまたは数値(日付、文字列、数値など)にすることができるということです。2 つの方法でベースをリクエストする必要があります。

  • ドキュメント #### のすべての値
  • または比較演算子を使用

私は2つの可能な解決策について考えました:

解決策 1:
単一のテーブル:
key(text) | type(one of text/date/float) | value(text)

比較が必要な場合は明示的なキャストを使用します(たとえば、
SELECT * FROM mytable WHERE (CAST(value as float) < "2010-01-01 00:00:00") AND (type='date')
または
SELECT * FROM mytable WHERE (CAST(value as float) < 17.5) AND (type='float')

このソリューションで私が好きなもの

  • すべての値を取得するのは簡単です

このソリューションで気に入らないこと:

  • (潜在的に)高価なキャストをたくさん作らなければならない

解決策 2:
3 つのテーブル:

  • テキスト値:key(text) | value(text)
  • フロート値:key(text) | value(float)
  • 日付値:key(text) | value(datetime)

このソリューションで私が好きなもの

  • もうキャストはいらない

このソリューションで気に入らないこと:

  • すべての値を取得するには、3 つの選択とユニオンのコストがかかります
  • これはあまりエレガントではないと思います

質問
では、どのソリューションをお勧めしますか?なぜ?提案する別の解決策はありますか?

4

1 に答える 1

0

私の経験から、値を文字列として保存することは完全に受け入れられ、最も単純で簡単です...
- 値自体に基づいて検索する必要はありません (インデックスを使用できません)
- 膨大な(数千/数百万) またはレコードを一度に


3 つのテーブルと 1 つのオプションには、気付いUNIONていないかもしれない制限がありますvalue。UNIONed ビューの列は、異なるデータ型にすることはできません。それらは (UNION の最初の SELECT のフィールドの型に基づいて) 暗黙的にキャストされるか、単にビューの作成に失敗します。

そのアイデアの私のバリエーションは、1 つではなく 3 つの値フィールドを持つことです。次に、それぞれに個別のインデックスを追加し、テーブルを 1 つだけ持つことができ、CAST の必要性やその他のさまざまな利点を回避できます。テーブルが少し余分に複雑になるという犠牲を払っていますが(クエリでそれを使用するよりも、ここでそれを好むでしょう)、使用されるスペースが大幅に増加します。

Key, Type, Value_INT, Value_FLOAT, Value_DATE


編集:

ああ、そして最後の選択肢。値を文字列として保存するのではなく、浮動小数点数として保存してください。あなたが言及した3つのデータ型はすべて浮動小数点数として格納でき、インデックスを使用できます。

SELECT * FROM mytable WHERE (type='date') AND (value < CAST("2010-01-01 00:00:00" AS FLOAT))

また

SELECT * FROM mytable WHERE (type='float') AND (value < 17.5)

また

SELECT * FROM mytable WHERE (type='int') AND (value < 17)

于 2011-05-06T13:54:15.683 に答える