我想設計一個將存儲註釋的sqlite數據庫。這些筆記中的每一個都有共同的字段,如標題,截止日期,詳細信息,優先級和已完成。如何將用戶自定義數據添加到數據庫?
此外,雖然,我想爲更專業的音符一樣的價格購物清單的項目和作者/出版商數據書籍添加數據。
我也想有一些通用的領域,用戶可以用任何文本數據,他們希望填補。
如何在這種情況下設計我的數據庫表?
我可能只是對每一塊數據的每一個音符一個領域,而是會浪費很多的領域,我想有其他的選擇和建議。
我想設計一個將存儲註釋的sqlite數據庫。這些筆記中的每一個都有共同的字段,如標題,截止日期,詳細信息,優先級和已完成。如何將用戶自定義數據添加到數據庫?
此外,雖然,我想爲更專業的音符一樣的價格購物清單的項目和作者/出版商數據書籍添加數據。
我也想有一些通用的領域,用戶可以用任何文本數據,他們希望填補。
如何在這種情況下設計我的數據庫表?
我可能只是對每一塊數據的每一個音符一個領域,而是會浪費很多的領域,我想有其他的選擇和建議。
你可以創建類似於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有兩個附加字段。第一個有一個價值「企鵝」,代表出版商。第二個具有「紅色」的值並且表示顏色。
那麼什麼是遠歸它這點?
的dynamic_note_field作爲你的數據定義,如果你有興趣回答一個問題,比如「我創建的附加字段是什麼」,這可以讓你輕鬆地做到這一點,而不必搜索所有的dynamic_note_field_data。最終,你可能會添加額外的信息表這樣一個是一個type
字段。我喜歡從蝙蝠身上創造這種分離,但這可能違反了YAGNI原則。
缺點:
這不是太糟糕來搜索有一個出版商,其中該發佈者是「企鵝」所有的音符。
棘手的事情就像「在任何領域找到值爲'企鵝'的任何音符」。你不知道哪個領域是你的搜索。在這一點上,你最好使用一個單獨的索引,這個索引與標準化的數據庫數據一起生成,這些數據充當了事實的真相。同樣,關於規範化的好處在於,您將數據保持在無損,無損狀態。
有幾種標準方法可以用來解決這種情況。
您可以爲每種筆記創建單獨的表,在每種情況下複製公共列。這很容易,但它會使查詢所有筆記變得困難。
您可以創建包含多列的一個大表和某種類型的字段,這將讓你知道它是哪種類型的說明(並因此列其子使用)
CREATE TABLE NOTE(ID int PRIMARY KEY,NOTE_TYPE int,DUEDATE datetime,...更常見的字段,價格NUMBER NULL,author VARCHAR(100)NULL,..更具體的字段)
你可以將你的表分成繼承關係像這樣:
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中對這些關係進行建模的典型權衡集,任何這些解決方案都可能適合用例,而不取決於您的性能要求。
如果你發現你的筆記屬於某些「類型」,這比我的建議好得多。我建議的方法非常靈活,但往往會導致非常柔軟的物體。使用發佈者字段的筆記也具有publish_date字段很難強制執行。 – Koobz 2010-05-09 19:14:06
@Koobz雖然我不需要強制執行。我只需要「類型」具有所有可用的特定字段,而不是填充。 – CodeFusionMobile 2010-05-09 20:05:28
我的應用程序實際上會過濾列表級別的類型。任何說明都可以被視爲任何類型,並非所有數據都是必需的。 I.E.購物清單物品可以放在待辦事項清單上,但它會顯示到期日而不是物品價格和數量。它幾乎沒有類型 – CodeFusionMobile 2010-07-10 13:52:43
對於要存儲的數據,但不一定要搜索,另一個選項是將其序列化到/來自JSON並將其存儲在TEXT列中。這給你任意的結構,但你不能隨時查詢這些值。
另一種選擇是轉儲SQLite並轉到對象數據庫。我似乎記得有一兩個Android的工作。然而,我還沒有嘗試過這些。
只需創建一個包含所有筆記共同字段的小表。 然後爲每一類特殊筆記提供一張表格,其中包含所有額外字體以及第一張桌子上的參考。
對於您要輸入的每個便箋,您將在主表(包含常用字段)中創建一行,並在額外表中包含額外字段的行以及對主表中的行的引用。 然後你只需要加入你的請求。
有了這個解決方案: 1)你有一個安全設計(不能訪問 2)你的數據庫將得到優化
我喜歡你的方法提供了額外的靈活性,這是不是你的注意部分字段) 。任何其他方式,我將不得不限制用戶可用的自定義字段的數量。這樣,他們可以動態地創建新的。搜索功能的喪失是一個問題,但我更關心維護引用完整性,因爲我使用的sqlite版本無法強制執行外鍵。 – CodeFusionMobile 2010-05-09 20:12:40