2010-05-09 173 views
0

我想設計一個將存儲註釋的sqlite數據庫。這些筆記中的每一個都有共同的字段,如標題,截止日期,詳細信息,優先級和已完成。如何將用戶自定義數據添加到數據庫?

此外,雖然,我想爲更專業的音符一樣的價格購物清單的項目和作者/出版商數據書籍添加數據。

我也想有一些通用的領域,用戶可以用任何文本數據,他們希望填補。

如何在這種情況下設計我的數據庫表?

我可能只是對每一塊數據的每一個音符一個領域,而是會浪費很多的領域,我想有其他的選擇和建議。

回答

1

你可以創建類似於custom_field表的東西。一旦你開始正常化,它會變得非常混亂。

所以你有你的筆記表與它的共同領域。

現在添加:

dynamic_note_field

id  label  
1  publisher 
2  color 
3  size 

dynamic_note_field_data

id  dynamic_note_field_id value 
1  1      Penguin 
2  1      Marvel 
3  2      Red 

最後,您可以與您的數據的情況下,與他們通過

使用note_dynamic_note_field_data

領域
note_id dynamic_note_field_data_id 
1  1 
1  3 
2  2 

所以現在我們已經說過:note_id 1有兩個附加字段。第一個有一個價值「企鵝」,代表出版商。第二個具有「紅色」的值並且表示顏色。

那麼什麼是遠歸它這點?

  1. 您不會浪費空間爲每個項目添加字段(通過m2m表格將註釋與其附加動態字段關聯起來)。
  2. 你不是存儲冗餘標籤(您可以繼續但存儲冗餘數據,因爲相同的發佈很可能出現很多次......這方面是非常主觀的。如果您想了解您的發佈豐富的數據,你通常希望採取將其變成自己的實體,而不是一個特設的字符串的步驟。使這一飛躍的時候,因爲它增加毛羽到數據庫的額外水平要小心。因此評估使用情況。

的dynamic_note_field作爲你的數據定義,如果你有興趣回答一個問題,比如「我創建的附加字段是什麼」,這可以讓你輕鬆地做到這一點,而不必搜索所有的dynamic_note_field_data。最終,你可能會添加額外的信息表這樣一個是一個type字段。我喜歡從蝙蝠身上創造這種分離,但這可能違反了YAGNI原則。

缺點:

這不是太糟糕來搜索有一個出版商,其中該發佈者是「企鵝」所有的音符。

棘手的事情就像「在任何領域找到值爲'企鵝'的任何音符」。你不知道哪個領域是你的搜索。在這一點上,你最好使用一個單獨的索引,這個索引與標準化的數據庫數據一起生成,這些數據充當了事實的真相。同樣,關於規範化的好處在於,您將數據保持在無損,無損狀態。

+0

我喜歡你的方法提供了額外的靈活性,這是不是你的注意部分字段) 。任何其他方式,我將不得不限制用戶可用的自定義字段的數量。這樣,他們可以動態地創建新的。搜索功能的喪失是一個問題,但我更關心維護引用完整性,因爲我使用的sqlite版本無法強制執行外鍵。 – CodeFusionMobile 2010-05-09 20:12:40

2

有幾種標準方法可以用來解決這種情況。

  1. 您可以爲每種筆記創建單獨的表,在每種情況下複製公共列。這很容易,但它會使查詢所有筆記變得困難。

  2. 您可以創建包含多列的一個大表和某種類型的字段,這將讓你知道它是哪種類型的說明(並因此列其子使用)

    CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TYPE int,DUEDATE datetime,...更常見的字段,價格NUMBER NULL,author VARCHAR(100)NULL,..更具體的字段)

  3. 你可以將你的表分成繼承關係像這樣:

    CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TY PE int,DUEDATE datetime,...更常見的字段);

    CREATE TABLE SHOPPINGLITITEM(ID INT PRIMARY KEY,NOTE_ID INT FORIENKEY NOTE.ID,價格數...更多購物清單項目字段)

選項1是容易實現,但將涉及大量的主要是多餘的表定義。

選項2會很容易地創建和容易寫上查詢,但會浪費空間

和期權3會更節省空間,減少多餘的,但很可能已經因爲所有的外鍵的慢查詢。

這是在SQL中對這些關係進行建模的典型權衡集,任何這些解決方案都可能適合用例,而不取決於您的性能要求。

+0

如果你發現你的筆記屬於某些「類型」,這比我的建議好得多。我建議的方法非常靈活,但往往會導致非常柔軟的物體。使用發佈者字段的筆記也具有publish_date字段很難強制執行。 – Koobz 2010-05-09 19:14:06

+0

@Koobz雖然我不需要強制執行。我只需要「類型」具有所有可用的特定字段,而不是填充。 – CodeFusionMobile 2010-05-09 20:05:28

+0

我的應用程序實際上會過濾列表級別的類型。任何說明都可以被視爲任何類型,並非所有數據都是必需的。 I.E.購物清單物品可以放在待辦事項清單上,但它會顯示到期日而不是物品價格和數量。它幾乎沒有類型 – CodeFusionMobile 2010-07-10 13:52:43

0

對於要存儲的數據,但不一定要搜索,另一個選項是將其序列化到/來自JSON並將其存儲在TEXT列中。這給你任意的結構,但你不能隨時查詢這些值。

另一種選擇是轉儲SQLite並轉到對象數據庫。我似乎記得有一兩個Android的工作。然而,我還沒有嘗試過這些。

0

只需創建一個包含所有筆記共同字段的小表。 然後爲每一類特殊筆記提供一張表格,其中包含所有額外字體以及第一張桌子上的參考。

對於您要輸入的每個便箋,您將在主表(包含常用字段)中創建一行,並在額外表中包含額外字段的行以及對主表中的行的引用。 然後你只需要加入你的請求。

有了這個解決方案: 1)你有一個安全設計(不能訪問 2)你的數據庫將得到優化

相關問題