比較 Java Enterprise Architecture 中的 MongoDB 和 Couchbase

MongoDB和Couchbase是兩種常用的NoSQL數(shù)據(jù)庫,用于在Java實(shí)現(xiàn)的企業(yè)架構(gòu)中存儲(chǔ)和管理數(shù)據(jù)。以下是它們之間的主要差異、比較和權(quán)衡。

在當(dāng)今快速發(fā)展的企業(yè)架構(gòu)領(lǐng)域,MongoDB和Couchbase已經(jīng)成為NoSQL數(shù)據(jù)庫中兩個(gè)重要的競爭者。本文全面探討了這兩個(gè)強(qiáng)大解決方案之間的關(guān)鍵差異、比較和權(quán)衡,揭示了它們獨(dú)特的特點(diǎn)和優(yōu)勢。在深入研究NoSQL數(shù)據(jù)庫時(shí),我將以實(shí)際的企業(yè)架構(gòu)為例,介紹如何在Java中使用MongoDB和Couchbase。這種實(shí)踐方法將提供關(guān)于它們各自性能和功能的見解,并演示如何在它們之間快速切換,確保無縫適應(yīng)項(xiàng)目需求。無論是經(jīng)驗(yàn)豐富的開發(fā)人員、數(shù)據(jù)庫管理員,還是對NoSQL數(shù)據(jù)庫感興趣,本文都將提供知識(shí),幫助在數(shù)據(jù)庫架構(gòu)中做出明智的決策。準(zhǔn)備好提升數(shù)據(jù)庫水平,優(yōu)化應(yīng)用程序以實(shí)現(xiàn)無與倫比的效率,并發(fā)現(xiàn)MongoDB和Couchbase在當(dāng)今動(dòng)態(tài)技術(shù)領(lǐng)域中的可能性吧。

MongoDB vs Couchbase

首先提供對NoSQL文檔數(shù)據(jù)庫的基礎(chǔ)理解,以及它們?nèi)绾胃镄聰?shù)據(jù)存儲(chǔ)和檢索。NoSQL數(shù)據(jù)庫采用靈活的模式和JSON/BSON文檔格式,為適應(yīng)不斷變化的數(shù)據(jù)需求鋪平了道路。

image.png

NoSQL文檔數(shù)據(jù)庫

NoSQL數(shù)據(jù)庫,也被稱為“Not Only SQL”,代表了一類旨在解決傳統(tǒng)關(guān)系型數(shù)據(jù)庫的局限性的數(shù)據(jù)庫。與具有固定模式和結(jié)構(gòu)化表的關(guān)系型數(shù)據(jù)庫不同,NoSQL數(shù)據(jù)庫提供了一種靈活的無模式數(shù)據(jù)模型。在NoSQL數(shù)據(jù)庫中,文檔數(shù)據(jù)庫以文檔的形式存儲(chǔ)和檢索數(shù)據(jù),通常是類似JSON的對象或BSON(二進(jìn)制JSON)文檔。這些文檔可以具有嵌套結(jié)構(gòu),使其能夠高度適應(yīng)不斷變化的數(shù)據(jù)需求。

Couchbase

image.png

Couchbase是一種領(lǐng)先的NoSQL文檔數(shù)據(jù)庫,以其出色的性能、可擴(kuò)展性和可用性而著稱。它結(jié)合了分布式鍵值存儲(chǔ)和面向文檔的數(shù)據(jù)庫的特點(diǎn),可以在多個(gè)節(jié)點(diǎn)和數(shù)據(jù)中心之間實(shí)現(xiàn)無縫的水平擴(kuò)展。Couchbase以其強(qiáng)一致性模型和處理低延遲、高吞吐量需求的大規(guī)模應(yīng)用的能力而聞名。它還提供強(qiáng)大的移動(dòng)和邊緣計(jì)算支持,使其成為需要在不同設(shè)備之間進(jìn)行數(shù)據(jù)同步的應(yīng)用程序的理想選擇。

Couchbase的優(yōu)點(diǎn)

  1. 高性能:Couchbase的分布式架構(gòu)和內(nèi)存優(yōu)先存儲(chǔ)引擎提供了出色的性能,即使在重負(fù)載下也能保證對數(shù)據(jù)的低延遲訪問。其高效的緩存機(jī)制優(yōu)化了讀寫操作,為高吞吐量應(yīng)用程序?qū)崿F(xiàn)了無縫擴(kuò)展。
  2. 可擴(kuò)展性:Couchbase的自動(dòng)分片和多維度擴(kuò)展能力使水平擴(kuò)展變得輕松。它可以快速跨多個(gè)節(jié)點(diǎn)和集群進(jìn)行擴(kuò)展,適應(yīng)不斷增長的數(shù)據(jù)和用戶需求,而不影響性能。
  3. 強(qiáng)一致性:Couchbase通過多維度擴(kuò)展(MDS)提供強(qiáng)一致性,為關(guān)鍵應(yīng)用程序提供了所需的ACID屬性。它確保數(shù)據(jù)的完整性和可靠性,適用于關(guān)鍵任務(wù)的使用場景。
  4. 內(nèi)置全文搜索:Couchbase集成了強(qiáng)大的全文搜索引擎,使開發(fā)人員能夠快速執(zhí)行復(fù)雜的搜索查詢,針對非結(jié)構(gòu)化數(shù)據(jù)。這個(gè)內(nèi)置功能簡化了開發(fā)過程,并增強(qiáng)了應(yīng)用程序的搜索功能。
  5. 移動(dòng)和邊緣計(jì)算支持:Couchbase提供了Couchbase Lite,一種專為移動(dòng)和邊緣計(jì)算設(shè)計(jì)的嵌入式NoSQL數(shù)據(jù)庫。它可以實(shí)現(xiàn)設(shè)備之間的無縫數(shù)據(jù)同步,支持離線訪問和實(shí)時(shí)更新,非常適合移動(dòng)應(yīng)用程序和物聯(lián)網(wǎng)使用場景。

MongoDB

image.png

MongoDB是另一個(gè)知名的NoSQL文檔數(shù)據(jù)庫,因其易用性、靈活性和強(qiáng)大的查詢能力而廣受歡迎。作為一種文檔數(shù)據(jù)庫,它將數(shù)據(jù)存儲(chǔ)在類似JSON的BSON文檔中,并允許動(dòng)態(tài)模式演化。MongoDB的設(shè)計(jì)非常適合敏捷開發(fā),使開發(fā)人員能夠快速迭代和適應(yīng)不斷變化的應(yīng)用需求。憑借其水平擴(kuò)展能力和豐富的工具和庫生態(tài)系統(tǒng),MongoDB已成為各種用例的熱門選擇,從Web應(yīng)用程序到大數(shù)據(jù)和實(shí)時(shí)分析等各個(gè)領(lǐng)域。

MongoDB的優(yōu)點(diǎn)

  1. 靈活的模式:MongoDB的無模式設(shè)計(jì)允許開發(fā)人員在運(yùn)行時(shí)調(diào)整數(shù)據(jù)結(jié)構(gòu),促進(jìn)敏捷開發(fā),并適應(yīng)不斷變化的應(yīng)用需求,無需進(jìn)行數(shù)據(jù)庫模式遷移。
  2. 水平擴(kuò)展性:MongoDB原生支持水平擴(kuò)展和自動(dòng)分片,使應(yīng)用程序能夠輕松處理大量數(shù)據(jù)和并發(fā)用戶流量。它確保用戶基數(shù)擴(kuò)大時(shí)的無縫增長。
  3. 豐富的查詢語言:MongoDB查詢語言(MQL)提供了一種靈活且表達(dá)力強(qiáng)的方式來檢索和操作數(shù)據(jù)。通過支持復(fù)雜查詢和強(qiáng)大的聚合管道,開發(fā)人員可以根據(jù)自己的需求定制響應(yīng)。
  4. 復(fù)制和高可用性:MongoDB的副本集架構(gòu)確保數(shù)據(jù)在多個(gè)節(jié)點(diǎn)之間自動(dòng)復(fù)制,保證數(shù)據(jù)冗余和高可用性。在主節(jié)點(diǎn)故障時(shí),輔助節(jié)點(diǎn)可以接管,最大程度地減少停機(jī)時(shí)間。
  5. 敏捷開發(fā):MongoDB的易用性、直觀的API和簡單的設(shè)置促進(jìn)了快速原型設(shè)計(jì)和開發(fā)周期。開發(fā)人員可以快速迭代和實(shí)驗(yàn),縮短新功能和應(yīng)用程序的上市時(shí)間。

Couchbase和MongoDB的共性

Couchbase和MongoDB共享一些核心特性和屬性:文檔存儲(chǔ):兩個(gè)數(shù)據(jù)庫都以靈活的、無模式的文檔形式存儲(chǔ)數(shù)據(jù),可以直接表示和操作數(shù)據(jù)。 水平擴(kuò)展性:它們都支持水平擴(kuò)展,允許應(yīng)用程序?qū)?shù)據(jù)分布在多個(gè)節(jié)點(diǎn)上,確保高可用性和容錯(cuò)性。 分布式架構(gòu):兩個(gè)數(shù)據(jù)庫都設(shè)計(jì)用于在分布式環(huán)境中工作,提供無縫的數(shù)據(jù)復(fù)制和分布。JSON/BSON支持:Couchbase和MongoDB使用類似JSON的BSON文檔作為主要的數(shù)據(jù)格式,確保與現(xiàn)代應(yīng)用程序架構(gòu)的兼容性。豐富的查詢功能:它們提供強(qiáng)大的查詢語言(Couchbase的N1QL和MongoDB的查詢語言),以高效地檢索和操作數(shù)據(jù)。接下來讓我們探討一下每個(gè)數(shù)據(jù)庫的權(quán)衡取舍。

Couchbase的利弊權(quán)衡

復(fù)雜性:在大規(guī)模部署中,設(shè)置和配置Couchbase集群可能比MongoDB更復(fù)雜。

學(xué)習(xí)曲線:對于剛接觸Couchbase的開發(fā)人員來說,由于其高級(jí)功能和概念,可能需要更長的學(xué)習(xí)曲線。

社區(qū)和生態(tài)系統(tǒng):雖然Couchbase的社區(qū)和生態(tài)系統(tǒng)正在不斷發(fā)展,但可能沒有MongoDB的那么廣泛,這可能導(dǎo)致資源和社區(qū)驅(qū)動(dòng)的解決方案較少。

MongoDB的利弊權(quán)衡

數(shù)據(jù)一致性:MongoDB的默認(rèn)一致性模型(最終一致性)可能不適用于需要強(qiáng)一致性的應(yīng)用程序,這需要仔細(xì)設(shè)計(jì)和考慮。

聯(lián)合操作:MongoDB不支持傳統(tǒng)的類SQL操作,可能導(dǎo)致復(fù)雜的數(shù)據(jù)去規(guī)范化和增加應(yīng)用程序端的處理。

內(nèi)存使用:MongoDB的內(nèi)存使用可能相對較高,特別是在使用大量索引或數(shù)據(jù)集時(shí),這可能會(huì)影響整體性能。

選擇Couchbase和MongoDB取決于具體的項(xiàng)目需求、現(xiàn)有的技術(shù)棧以及對一致性、可擴(kuò)展性和易用性的需求。了解每個(gè)數(shù)據(jù)庫的權(quán)衡取舍可以使架構(gòu)師和開發(fā)人員能夠做出明智的決策,以滿足其應(yīng)用程序的獨(dú)特需求和性能目標(biāo)。

FEATURE COUCHBASE MONGODB
Query Language N1QL (SQL-like queries) MongoDB Query Language (MQL)
Consistency Model Strong consistency Eventual consistency (configurable)
Sharding Mechanism Automatic and manual sharding Automatic sharding
Aggregation Framework Yes (with N1QL) Yes
Joins Yes (with N1QL) No (denormalization required)

我們對Couchbase和MongoDB進(jìn)行的比較研究展示了它們在NoSQL文檔數(shù)據(jù)庫中靈活性和可擴(kuò)展性方面的優(yōu)勢。雖然Couchbase在強(qiáng)一致性和高吞吐能力方面表現(xiàn)出色,MongoDB在靈活性和用戶友好性方面表現(xiàn)出色。下一節(jié)課將帶來一個(gè)令人興奮的實(shí)時(shí)代碼演示,我們將在Java中使用這兩個(gè)數(shù)據(jù)庫在真實(shí)場景中展示它們的真正潛力。通過實(shí)際示例,我們將學(xué)習(xí)如何利用它們的獨(dú)特功能,執(zhí)行查詢,管理一致性和處理聚合。加入我們,享受這種沉浸式體驗(yàn),發(fā)現(xiàn)如何使用Couchbase和MongoDB構(gòu)建高效、可擴(kuò)展的應(yīng)用程序,推動(dòng)現(xiàn)代數(shù)據(jù)管理的邊界。


代碼展示

我們使用Jakarta NoSQL規(guī)范在Java企業(yè)應(yīng)用程序中同時(shí)使用Couchbase和MongoDB。利用NoSQL數(shù)據(jù)庫的強(qiáng)大功能,我們將創(chuàng)建一個(gè)高效管理啤酒交付地址和用戶信息的啤酒工廠應(yīng)用程序。該應(yīng)用程序?qū)⒃贠pen Liberty服務(wù)器上運(yùn)行,并與Jakarta EE 10或Eclipse MicroProfile 6供應(yīng)商兼容。

image.png

為了開始,我們將使用Jakarta EE Starter或Eclipse MicroProfile Starter創(chuàng)建項(xiàng)目,然后添加所需的依賴項(xiàng)。借助Jakarta NoSQL的廣泛數(shù)據(jù)庫支持,我們將在Maven依賴列表中添加Couchbase和MongoDB。

<dependency>

    <groupId>org.eclipse.jnosql.databases</groupId>

    <artifactId>jnosql-couchbase</artifactId>

    <version>${jnosql.version}</version>

</dependency>

<dependency>

    <groupId>org.eclipse.jnosql.databases</groupId>

    <artifactId>jnosql-mongodb</artifactId>

    <version>${jnosql.version}</version>

</dependency>

一旦設(shè)置了依賴項(xiàng),我們將在microprofile-config.properties文件中配置憑據(jù)。此外,我們將遵循Twelve-Factor App原則,并利用Eclipse MicroProfile Configuration的系統(tǒng)環(huán)境配置覆蓋。該鍵將確保在類路徑中存在多個(gè)選項(xiàng)時(shí)選擇適當(dāng)?shù)奈臋n提供程序。jnosql.document.provider

jnosql.couchbase.host=couchbase://localhost
jnosql.couchbase.user=root
jnosql.couchbase.password=123456
jnosql.document.database=factory
jnosql.mongodb.host=localhost:27017
#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

應(yīng)用程序的核心在于實(shí)體創(chuàng)建,我們在其中定義實(shí)體以及嵌套的子文檔結(jié)構(gòu)。BeerAddress(啤酒地址)

@Entity("beer")
public class Beer {

   @Id
   private String id;

  @Column
  private String name;

    @Column
    private String style;

    @Column
    private String hop;

    @Column
    private  String yeast;

    @Column
    private String malt;

    @Column
    private Address address;

    @Column
    private  String user;
}

@Entity
public class Address {

    @Column
    private String city;

    @Column
    private String country;

}

準(zhǔn)備好實(shí)體后,我們將使用Template和DocumentTemplate在Java應(yīng)用程序和數(shù)據(jù)庫之間建立通信。利用Jakarta Data的存儲(chǔ)庫接口,我們將高效地與數(shù)據(jù)庫進(jìn)行交互,并對實(shí)體執(zhí)行CRUD操作。Beer(啤酒)

@Entity("beer")
public class Beer {

   @Id
   private String id;

  @Column
  private String name;

    @Column
    private String style;

    @Column
    private String hop;

    @Column
    private  String yeast;

    @Column
    private String malt;

    @Column
    private Address address;

    @Column
    private  String user;
}

@Entity
public class Address {

    @Column
    private String city;

    @Column
    private String country;

}

構(gòu)建這個(gè)強(qiáng)大應(yīng)用程序的旅程以執(zhí)行應(yīng)用程序、觀察Couchbase和MongoDB的無縫集成以及體驗(yàn)高效管理啤酒交付數(shù)據(jù)的過程中結(jié)束。通過這個(gè)項(xiàng)目,我們將深入了解如何在Java企業(yè)應(yīng)用程序中利用NoSQL數(shù)據(jù)庫的能力,為可擴(kuò)展、高性能的數(shù)據(jù)管理解決方案奠定基礎(chǔ)。加入我們,通過實(shí)踐體驗(yàn),深入探索NoSQL數(shù)據(jù)庫的世界,并發(fā)掘它們在企業(yè)架構(gòu)中的潛力。


MongoDB配置與運(yùn)行

在配置了兩個(gè)數(shù)據(jù)庫之后,我們繼續(xù)進(jìn)行下一步,為我們的項(xiàng)目設(shè)置MongoDB和Couchbase。首先是MongoDB,該過程涉及創(chuàng)建和配置數(shù)據(jù)庫環(huán)境。為了簡單起見,我們可以使用提供的命令使用單個(gè)Docker容器:

docker run -d --name mongodb-instance -p 27017:27017 mongo

接下來,我們通過注釋Couchbase行并取消注釋MongoDB行來修改屬性文件,將MongoDB設(shè)置為提供程序:

#for use couchbase uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

設(shè)置好MongoDB后,現(xiàn)在可以根據(jù)需要使用它了。

Couchbase配置與運(yùn)行

轉(zhuǎn)向Couchbase,我們采用類似的方法,使用提供的命令創(chuàng)建一個(gè)用于測試目的的單個(gè)Docker容器:

docker run -d --name db -p 8091-8097:8091-8097 -p 9123:9123 -p 11207:11207 -p 11210:11210 -p 11280:11280 -p 18091-18097:18091-18097 couchbase

雖然Couchbase需要更多的設(shè)置配置,但您可以通過其用戶界面(UI)輕松定義所需的參數(shù),通過瀏覽器訪問:

  1. 訪問對應(yīng)站點(diǎn)
  2. 選擇“Setup New Cluster”。
  3. 將管理員用戶名定義為root。
  4. 將密碼定義為123456。
  5. 將集群名稱設(shè)置為localhost。
  6. 接受條款和條件。
  7. 導(dǎo)航到“Buckets”選項(xiàng)卡。
  8. 使用“Add Bucket”選項(xiàng)創(chuàng)建一個(gè)名為beers的bucket。
  9. 點(diǎn)擊“Add”并添加beersHeroVillain作為集合。
  10. 轉(zhuǎn)到“Query”選項(xiàng)卡并執(zhí)行以下代碼:CREATE PRIMARY INDEX #primary ON factory._default.beer

在配置中,我們需要做與之前相反的操作,如下所示:

#for use couchbase uncomment this line
jnosql.document.provider=org.eclipse.jnosql.databases.couchbase.communication.CouchbaseDocumentConfiguration
#for use MongoDB uncomment this line
#jnosql.document.provider=org.eclipse.jnosql.databases.mongodb.communication.MongoDBDocumentConfiguration

現(xiàn)在MongoDB和Couchbase都準(zhǔn)備就緒,我們可以開發(fā)我們的啤酒工廠應(yīng)用程序,利用Jakarta NoSQL的能力,無縫地使用Java與這些強(qiáng)大的NoSQL數(shù)據(jù)庫進(jìn)行交互。我們將同時(shí)構(gòu)建并演示在MongoDB和Couchbase上運(yùn)行的項(xiàng)目。


使用API

一旦根據(jù)自己的偏好定義和設(shè)置了數(shù)據(jù)庫,可以按照以下步驟設(shè)置項(xiàng)目:

  1. 使用Maven構(gòu)建項(xiàng)目:
mvn clean package
  1. 運(yùn)行應(yīng)用程序:
java -jar target/eclipse-store.jar

現(xiàn)在應(yīng)用程序正在運(yùn)行,您可以使用任何HTTP客戶端進(jìn)行測試。在這種情況下,我們將使用curl進(jìn)行演示。要生成隨機(jī)的啤酒數(shù)據(jù),請使用以下命令:

curl --location --request POST 'http://localhost:9080/beers/random'

要檢索所有的啤酒,請使用以下命令:

curl --location 'http://localhost:9080/beers/'

根據(jù)特定條件(例如,啤酒花“Magnum”或麥芽“Vienna”)篩選啤酒,請使用以下命令:

url --location 'http://localhost:9080/beers/?page=1&hop=Magnum'
curl --location 'http://localhost:9080/beers/?page=1&hop=Magnum&malt=Vienna'

通過執(zhí)行這些命令,您將與使用Jakarta NoSQL無縫通信的Beer Factory應(yīng)用程序進(jìn)行交互,該應(yīng)用程序與MongoDB和Couchbase數(shù)據(jù)庫進(jìn)行交互。通過這個(gè)演示,您可以見證NoSQL數(shù)據(jù)庫在企業(yè)應(yīng)用程序中的強(qiáng)大和高效性,展示了Couchbase和MongoDB在Java環(huán)境中的真正潛力。


結(jié)論

我們已經(jīng)踏上了一段啟發(fā)性的旅程,探索了兩個(gè)著名的NoSQL數(shù)據(jù)庫:MongoDB和Couchbase的強(qiáng)大之處。借助Jakarta NoSQL的能力,我們將這些數(shù)據(jù)庫無縫集成到Java企業(yè)應(yīng)用程序中,釋放了它們在高效數(shù)據(jù)管理和檢索方面的潛力。通過Eclipse JNoSQL實(shí)現(xiàn)的Jakarta NoSQL,我們體驗(yàn)到了在Jakarta EE生態(tài)系統(tǒng)中使用NoSQL數(shù)據(jù)庫的便利性。標(biāo)準(zhǔn)化的注解、API和Jakarta Data的存儲(chǔ)庫接口簡化了開發(fā)過程,使我們能夠與MongoDB和Couchbase進(jìn)行順暢的通信。

通過采用Jakarta NoSQL,我們利用了NoSQL文檔數(shù)據(jù)庫的靈活性,擁抱了JSON/BSON文檔的無模式特性。它使我們能夠迅速適應(yīng)不斷變化的數(shù)據(jù)需求,這在具有不斷變化需求的現(xiàn)代企業(yè)應(yīng)用程序中是一個(gè)重要的優(yōu)勢。Jakarta NoSQL的無縫切換能力使我們能夠根據(jù)項(xiàng)目需求輕松切換MongoDB和Couchbase之間。通過簡單的配置更改,我們能夠充分利用兩個(gè)數(shù)據(jù)庫的優(yōu)勢,確保最佳性能和可擴(kuò)展性。

Docker容器進(jìn)一步簡化了設(shè)置過程,允許我們?yōu)闇y試和開發(fā)目的創(chuàng)建隔離的環(huán)境。只需幾個(gè)命令,我們就可以擁有完全功能的MongoDB和Couchbase實(shí)例,可以與我們的應(yīng)用程序進(jìn)行交互。在整個(gè)旅程中,我們見證了Jakarta NoSQL在創(chuàng)建強(qiáng)大、可擴(kuò)展和高性能的Java企業(yè)應(yīng)用程序方面的能力,可以利用多個(gè)NoSQL數(shù)據(jù)庫的能力。隨著NoSQL領(lǐng)域的不斷發(fā)展,Jakarta NoSQL仍然是無縫集成和高效利用企業(yè)架構(gòu)中NoSQL數(shù)據(jù)庫的可靠選擇。

Jakarta NoSQL及其由Eclipse JNoSQL實(shí)現(xiàn)的工具已經(jīng)成為現(xiàn)代Java開發(fā)人員的寶貴工具,可以輕松高效地使用像MongoDB和Couchbase這樣的NoSQL數(shù)據(jù)庫。隨著我們在數(shù)據(jù)管理方面的探索和創(chuàng)新的不斷進(jìn)行,Jakarta NoSQL無疑將始終處于前沿,賦予開發(fā)人員在不斷變化的技術(shù)環(huán)境中構(gòu)建可擴(kuò)展、靈活、高性能應(yīng)用程序的能力。

作者:Otavio Santana

更多技術(shù)干貨盡在wx“云原生數(shù)據(jù)庫”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容