我試圖建立一個在CouchDB中有「關係」的網盤般的場景:具有三個實體(用戶,文件夾,文件)的CouchDB上的哪個數據結構?
- 用戶
- 文件夾
- 文件
到目前爲止我struggeling是否引用或嵌入上述內容,尚未解決權限問題。在我的場景中,我只想存儲文件的路徑,而不想使用附件。下面是我有:
選項1(單獨的文件)
在這裏,我連鎖只是一切融合在一起,它(至少對我來說)似乎是一個RDBMS模型的副本這不應該是目標當使用NoSQL時。
{
"id": "user1",
"type": "user",
"folders": [
"folder1",
"folder2"
]
}
{
"id": "folder1",
"type": "folder",
"path": "\\user1\\pictures",
"files": [
"file1",
"file2"
]
}
{
"id": "file1",
"type": "file",
"name": "myDoc.txt",
}
選項2(單獨的文件)
在此選項中我會離開的用戶文檔,因爲它是和放到文件夾中文件的用戶ID爲參考的目的。
{
"id": "user1",
"type": "user",
}
{
"id": "folder1",
"type": "folder",
"path": "\\user1\\pictures",
"owner" "user1",
"files": [
"file1",
"file2"
]
}
{
"id": "file1",
"type": "file",
"name": "myDoc.txt",
}
選項3(嵌入式文件)
類似選項2我在這裏會駁回第三文檔類型文件並嵌入到一切文件夾的文件。我讀過這只是一個選項,如果我不需要存儲很多項目,並且我不知道用戶將存儲多少項目。
{
"id": "user1",
"type": "user",
}
{
"id": "folder1",
"type": "folder",
"path": "\\user1\\pictures",
"owner" "user1",
"files": [{
"id": "file1",
"type": "file",
"name": "myDoc1.txt"
}, {
"id": "file2",
"type": "file",
"name": "myDoc2.txt"
}
]
}
選項4
我也可以把一切都只是一個文件,但在這種情況下這是沒有意義的。 JSON文檔會在時間上變得很大,這對於性能/加載時間來說並不合適。
結論
對我來說沒有任何上述選項似乎適合我的方案,我希望聽取您如何在CouchDB的設計合適的數據庫架構一些輸入。或者,也許上述選項之一已經是一個好的開始,我只是沒有看到它。
如果以上選項都不符合您的方案,也許CouchDB不是您應該使用的數據庫類型?此外,我假設查詢需要非常重要,因爲用戶可能希望查找某些文件,無論文件夾的級別如何。除非您使用#1選項,否則使用CouchDB時速度會非常慢。 –
這並不是說他們不適合我的場景,更像是我需要一些指導來選擇合適的設計。一般來說,我對CouchDB和NoSQL相當陌生。在我的項目中,我必須使用CouchDB。現在我認爲選項1將是開始時的方式,並看看它是否有效。 – Magiranu
根據我的經驗,我們傾向於儘可能多地嵌套文檔以避免關係。因此,有些情況下這沒有任何意義。如果有時可以有一些「關係」。在你的情況下,唯一可行的解決方案將是1. –