例如,假設我正在嘗試為存盤 Instagram 帖子的資料庫設計一個模型,并且單個帖子可以包含多個影像。假設我在 S3 中存盤影像。我的問題是如何將影像和帖子聯系在一起?
在標準關系資料庫中,我可能會為影像創建一個單獨的表,并將 Instagram 帖子的外鍵和影像路徑存盤在 S3 中。然后當我檢索帖子時,我會加入這個影像表。
在像 MongoDB 或 Cassandra 這樣的 NoSQL DB 中,我的理解是為了延遲,最好避免連接。那么我會直接在我的帖子表中存盤一組影像路徑嗎?
uj5u.com熱心網友回復:
在 mongodb 的情況下,我的方法是這樣的:
{
"name":"post1",
"content":"post1 content",
"images":[
"https://example.com/img1.jpg",
"https://example.com/img2.jpg"
]
}
是的,嵌入比鏈接其他檔案要好,除非您有充分的理由。
即使您需要獲取所有影像,您也可以查詢資料庫,并根據您的需要投影結果。
uj5u.com熱心網友回復:
提供 Cassandra 答案:
與 MongoDB 解決方案類似,Cassandra 允許您將這樣的資料嵌入到集合中。在這種情況下, aLIST將是一個不錯的選擇。
此外,您還需要根據查詢方式對資料進行建模。雖然擁有 post id 很有用,但它可能是查詢使用率較低的東西。更有可能的是,對類似帖子的資料的查詢是按日期和/或時間進行的,因此重點關注這一點很重要。
考慮到所有這些,生成的 Cassandra 表應該如下所示:
CREATE TABLE stackoverflow.posts_by_month (
month int,
posttime timestamp,
id uuid,
content text,
images list<text>,
name text,
PRIMARY KEY (month, posttime, id)
) WITH CLUSTERING ORDER BY (posttime DESC, id ASC);
請注意,對于您的用例而言,月份可能是也可能不是一個好的價值。根據給定月份寫了多少帖子,可能需要較小的“時間段”。
然后您可以查詢上個月內的帖子,如下所示:
SELECT post_time,name,content,images FROM posts_by_month
WHERE month=202111
AND posttime > '2021-11-01 09:00';
posttime | name | content | images
--------------------------------- ------- --------------- --------------------------
2021-11-01 09:19:00.000000 0000 | post1 | post1 content | ['img1.jpg', 'img2.jpg']
(1 rows)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/344963.html
