數(shù)據(jù)的存儲方式有很多種。根據(jù)不同的需求可以做出不同的選擇。我們以開發(fā)一個問答系統(tǒng)為例,來介紹一下他們的不同使用場景和方法。
關(guān)系型數(shù)據(jù)庫利用關(guān)系型數(shù)據(jù)庫比如MySQL,是最常用的一種方式。剛開始開發(fā)一個簡單的問答系統(tǒng)。你就可以建幾張表:
上面的實體關(guān)系圖是我剛用PlantUML畫的一個簡化版,幫助理解。源代碼在這里:
@startuml!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>!define primary_key(x) <b>x</b>!define unique(x) <color:green>x</color>!define not_null(x) <u>x</u>hide methodshide stereotypes' entitiesTable(users, "users\n(存儲用戶信息)") {primary_key(id) INTEGERnot_null(unique(username)) VARCHAR[32]not_null(password) VARCHAR[64]age SMALLINTgender SMALLINTbirthday DATETIME}Table(questions, "questions\n(存儲問題信息)") {primary_key(question_id) INTEGERnot_null(unique(user_id)) INTEGERtitle VARCHAR[255]content VARCHAR[2048]creationTime DATETIMEupdateTime DATETIME}Table(answers, "answers\n(存儲問題的答案)") {primary_key(answer_id) INTEGERprimary_key(question_id) INTEGERnot_null(unique(user_id)) INTEGERcontent VARCHAR[2048]creationTime DATETIMEupdateTime DATETIME}' relationships' one to may relationship, 一對多的關(guān)系users --> questions : "1個用戶提了多個問題"users --> answers : "1個用戶寫了多個問題的答案"questions --> answers : "1個問題有多個答案"@enduml我是用VSCODE的插件畫的:
設(shè)計好表之后就可以在MySQL里面建表。
如果你用Java做,可以利用JPA框架做數(shù)據(jù)存儲。簡單的可以利用MyBatis。MyBatis是一個Java持久化框架,它通過XML描述符或注解把對象與SQL語句關(guān)聯(lián)起來,簡單、容易上手。建議剛開始可以利用這個練練手。
復(fù)雜一些的可以利用Hibernate。Hibernate是一個開放源代碼的對象關(guān)系映射框架,如果你喜歡面向?qū)ο蟮木幊蹋蔷涂梢岳肏ibernate把你設(shè)計的對象映射到數(shù)據(jù)庫的各個表,方便存取。但是這個相對復(fù)雜,學(xué)習(xí)起來比較花時間。
NoSQL你也可以利用NoSQL數(shù)據(jù)庫,也非常簡單。比如mongodb. mongodb是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。你可以把上面的表都設(shè)計成JSON文檔,直接存儲在mongodb里面。
全文檢索 elasticsearch如果要支持全文檢索,你需要用Elasticsearch。Elasticsearch是一個分布式的全文搜索引擎。
緩存 Redis如果你的用戶量大了,要提高系統(tǒng)的訪問速度。你需要用到各種緩存技術(shù)比如redis。
消息系統(tǒng) Kafka如果你的系統(tǒng)發(fā)展壯大了,又開發(fā)出很多其他的系統(tǒng)。比如推薦系統(tǒng),審核系統(tǒng)。你的各個系統(tǒng)之間需要消息通訊。你還需要用到消息系統(tǒng) Kafka。
我有幾個視頻,利用動畫來演示和解釋Kafka的原理,歡迎觀看和評論。
分布式存儲 Hadoop HDFS隨著你的用戶的增加,內(nèi)容的增加,你的網(wǎng)站每天產(chǎn)生幾百GB甚至幾百TB的數(shù)據(jù)。你就需要用到分布式存儲 Hadoop。
我也分享了一些關(guān)于Hadoop的視頻,利用動畫來演示Hadoop的原理實現(xiàn),歡迎關(guān)注。
總結(jié)根據(jù)系統(tǒng)的不同需求和不同發(fā)展階段,可以選擇不同的存儲方式。如果是一開始為了驗證自己的產(chǎn)品的想法,也就是做PoC (prove of concept),那就可以選擇簡單易用的,比如MySQL,MongoDB等。等將來系統(tǒng)發(fā)展了,根據(jù)需要再升級存儲方式,比如ES,redis,kafka還有hadoop。
上面說的各種存儲方式都支持各種編程語言,Java,Python,Ruby,NodeJS等等。簡單易用。
如果是個人學(xué)習(xí)技術(shù),建議從簡單的開始,做一個小的項目,比如我給的問答的例子。慢慢體會不同的技術(shù)的不同使用方法和應(yīng)用場景。
希望可以幫助到你。有問題可以在評論區(qū)提問,我會一一解答。
本人,@小馬過河Vizit,專注于分布式系統(tǒng)原理和實踐分享。希望利用動畫生動而又準(zhǔn)確地演示抽象的原理。
關(guān)于我的名字。小馬過河Vizit,意為凡事像小馬過河一樣,需要自己親自嘗試、探索才能獲得樂趣和新知。Vizit是指Visualize it的縮寫。一圖勝千言,希望可以利用動畫來可視化抽象的原理。
歡迎關(guān)注,點贊! 謝謝支持。