2011-05-06 51 views
2

我必須在SQLite數據庫中節省很多(超過50 000行)document - key - value。 我的擔心是:這些值可以是文本或數字(有日期,字符串,數字等)。 我必須請求我的基地2種方式:SQLite ERD(投與vs聯盟的成本)

  • 文檔的所有值####
  • 或比較操作

我想到了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:
三個表:

  • 文本值:key(text) | value(text)
  • 浮點值:key(text) | value(float)
  • 日期值:key(text) | value(datetime)

我在這個解決方案喜歡什麼:

  • 沒有更多蒙上

我不會在這個解決方案喜歡什麼:

  • 讓所有的值有3個選擇的成本和工會
  • 我覺得這不太優雅

問題
所以來你推薦到該解決方案的問題我?爲什麼?你有另外一個解決方案來建議嗎?

+0

' 「17.5」'應該不會有行情,只是讀作17.5'。而基於「日期」的示例應該投射到DATETIME,而不是FLOAT。 – MatBailie 2011-05-06 13:56:35

+0

請原諒我的無知。什麼是MCD? – Tim 2011-05-06 14:28:39

+1

對不起,使用了法語的縮寫:MCD代表「modèleconceptuel dedonnées」,ERM(實體關係模型)的法語名稱 – CircleCode 2011-05-06 14:40:12

回答

0

根據我的經驗,將值存儲爲字符串是完全可以接受的,並且最簡單/直接,只要...
- 你永遠不會有一個基於本身的價值(不能使用索引)搜索
- 你不馬上


三個選項處理龐大的(千/百萬),或記錄表和UNION有一個限制,您可能沒有發現:UNIONed視圖中的value列不能是不同的數據類型。他們將隱式投射(基於UNION的第一個SELECT中的字段類型),否則視圖將無法創建。

我的這個想法的變化將是有三個值域代替一個。然後,您可以爲每個添加一個單獨的索引,只有一個表格,避免需要CAST和各種其他好處。所有這一切都是以犧牲表格中一點點額外的複雜性爲代價的(我寧願在這裏使用它,而不是使用它的查詢),但是在使用的空間上也有很大的增加。

Key, Type, Value_INT, Value_FLOAT, Value_DATE


編輯:

哦,最後的選擇。不要將值存儲爲字符串,而是將它們存儲爲浮點數。您提到的所有三種數據類型都可以存儲爲浮點數,從而允許使用索引。

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)

+0

如果我正確理解[親和性轉換](http://www.sqlite.org/datatype3.html#affinity),應該保留具有_REAL_親和性的列中的文本值,以保留最後一個選項。 我想我會認真考慮這個選項:)(難道這不是一個太血腥的棘手選擇嗎?) – CircleCode 2011-05-06 14:45:25