2 回答

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果您有用戶和評(píng)論,您可以輕松地對(duì)其進(jìn)行建模:
ROOT | +-- vzhen | | | +-- Vzhen's comment 1 | | | +-- Vzhen's comment 2 | +-- Frank van Puffelen | +-- Frank's comment 1 | +-- Frank's comment 2
然而,更有可能的是,第三個(gè)實(shí)體,如文章,以及用戶正在評(píng)論(彼此的)文章。
Firebase沒有外鍵的概念,但很容易模仿外鍵。如果您這樣做,您可以像這樣建模用戶/文章/評(píng)論結(jié)構(gòu):
ROOT | +-- ARTICLES | | | +-- Text of article 1 (AID=1) | | | +-- Text of article 2 (AID=2) | +-- USERS | | | +-- vzhen (UID=1056201) | | | +-- Frank van Puffelen (UID=209103) | +-- COMMENTS | | | +-- Vzhen's comment on Article 1 (CID=1) | | | +-- Frank's response (CID=2) | | | +-- Frank's comment on article 2 (AID=2,UID=209103) | +-- ARTICLE_USER_COMMENT | +-- (AID=1,UID=1056201,CID=1) | +-- (AID=1,UID=209103,CID=2) | +-- (AID=2,UID=209103,CID=3)
這是您在關(guān)系數(shù)據(jù)庫(kù)中對(duì)此進(jìn)行建模的方式的直接映射。此模型的主要問題是您需要執(zhí)行的查找次數(shù)才能獲得單個(gè)屏幕所需的信息。
閱讀文章本身(來(lái)自ARTICLES節(jié)點(diǎn))
閱讀有關(guān)注釋的信息(來(lái)自ARTICLE_USER_COMMENT節(jié)點(diǎn))
閱讀評(píng)論的內(nèi)容(來(lái)自COMMENTS節(jié)點(diǎn))
根據(jù)您的需要,您甚至可能還需要閱讀USERS節(jié)點(diǎn)。
請(qǐng)記住,F(xiàn)irebase沒有WHERE子句的概念,只允許您從ARTICLE_USER_COMMENT中選擇與特定文章或特定用戶匹配的元素。
實(shí)際上,這種映射結(jié)構(gòu)的方法是不可用的。Firebase是一種分層數(shù)據(jù)結(jié)構(gòu),因此我們應(yīng)該使用獨(dú)特的功能來(lái)提供更多傳統(tǒng)的關(guān)系模型。例如:我們不需要ARTICLE_USER_COMMENT節(jié)點(diǎn),我們可以直接在每篇文章,用戶和評(píng)論本身下保留這些信息。
這個(gè)小片段:
ROOT | +-- ARTICLES | | | +-- Text of article 1 (AID=1) | . | | . +-- (CID=1,UID=1056201) | . | | +-- (CID=2,UID=209103) | +-- USERS | | | +-- vzhen (UID=1056201) | . | | . +-- (AID=1,CID=1) | . | +-- COMMENTS | +-- Vzhen's comment on Article 1 (CID=1) | +-- Frank's response (CID=2) | +-- Frank's comment on article 2 (CID=3)
你可以在這里看到,我們正在通過(guò)文章和用戶節(jié)點(diǎn)傳播來(lái)自ARTICLE_USER_COMMENT的信息。這有點(diǎn)使數(shù)據(jù)非規(guī)范化。結(jié)果是,當(dāng)用戶向文章添加評(píng)論時(shí),我們需要更新多個(gè)節(jié)點(diǎn)。在上面的示例中,我們必須將注釋本身添加,然后將節(jié)點(diǎn)添加到相關(guān)的用戶節(jié)點(diǎn)和文章節(jié)點(diǎn)。優(yōu)點(diǎn)是當(dāng)我們需要顯示數(shù)據(jù)時(shí),我們有更少的節(jié)點(diǎn)要讀取。
如果你將這種非規(guī)范化最極端化,你最終得到的數(shù)據(jù)結(jié)構(gòu)如下:
ROOT | +-- ARTICLES | | | +-- Text of article 1 (AID=1) | | | | | +-- Vzhen's comment on Article 1 (UID=1056201) | | | | | +-- Frank's response (UID=209103) | | | +-- Text of article 2 (AID=2) | | | +-- Frank's comment on Article 2 (UID=209103) | +-- USERS | +-- vzhen (UID=1056201) | | | +-- Vzhen's comment on Article 1 (AID=1) | +-- Frank van Puffelen (UID=209103) | +-- Frank's response (AID=1) | +-- Frank's comment on Article 2 (AID=2)
您可以看到我們?cè)谧詈笠粋€(gè)示例中刪除了COMMENTS和ARTICLE_USER_COMMENT節(jié)點(diǎn)。有關(guān)文章的所有信息現(xiàn)在都直接存儲(chǔ)在文章節(jié)點(diǎn)本身下,包括對(duì)該文章的評(píng)論(與發(fā)表評(píng)論的用戶的“鏈接”)。現(xiàn)在,有關(guān)用戶的所有信息都存儲(chǔ)在該用戶的節(jié)點(diǎn)下,包括用戶發(fā)表的評(píng)論(與評(píng)論所涉文章的“鏈接”)。
對(duì)于這個(gè)模型而言,唯一仍然棘手的事情是Firebase沒有API來(lái)遍歷這樣的“鏈接”,因此您必須自己查找用戶/文章。如果您使用UID / AID(在此示例中)作為標(biāo)識(shí)用戶/文章的節(jié)點(diǎn)的名稱,這將變得更加容易。
這導(dǎo)致了我們的最終模型:
ROOT | +-- ARTICLES | | | +-- AID_1 | | | | | +-- Text of article 1 | | | | | +-- COMMENTS | | | | | +-- Vzhen's comment on Article 1 (UID=1056201) | | | | | +-- Frank's response (UID=209103) | | | +-- AID_2 | | | +-- Text of article 2 | | | +-- COMMENTS | | | +-- Frank's comment on Article 2 (UID=209103) | +-- USERS | +-- UID_1056201 | | | +-- vzhen | | | +-- COMMENTS | | | +-- Vzhen's comment on Article 1 (AID=1) | +-- UID_209103 | +-- Frank van Puffelen | +-- COMMENTS | +-- Frank's response (AID=1) | +-- Frank's comment on Article 2 (AID=2)
我希望這有助于理解分層數(shù)據(jù)建模和所涉及的權(quán)衡。
添加回答
舉報(bào)