java - 為了避免數(shù)據(jù)庫(kù)一對(duì)多多對(duì)多的復(fù)雜關(guān)系,我對(duì)數(shù)據(jù)庫(kù)的設(shè)計(jì)是沒有外鍵,這種方式可以嗎
問(wèn)題描述
為了避免數(shù)據(jù)庫(kù)一對(duì)多多對(duì)多的復(fù)雜關(guān)系,我對(duì)數(shù)據(jù)庫(kù)的設(shè)計(jì)是表里的字段都沒有外鍵,其關(guān)系使用setter和getter來(lái)手動(dòng)關(guān)聯(lián),但是程序?qū)懴聛?lái)了,功能是可以實(shí)現(xiàn),但是發(fā)現(xiàn)要寫一大堆的getter與setter,很痛苦,還是說(shuō)從一開始就不應(yīng)該這樣設(shè)計(jì)呢
問(wèn)題解答
回答1:這樣設(shè)計(jì)很好啊,你只是缺一個(gè)數(shù)據(jù)庫(kù)抽象層,或者 ROM。
數(shù)據(jù)庫(kù)理論有個(gè)概念叫:CAP。
CAP理論是由 EricBrewer 教授提出的,在設(shè)計(jì)和部署分布式應(yīng)用的時(shí)候,存在三個(gè)核心的系統(tǒng)需求,這個(gè)三個(gè)需求之間存在一定的特殊關(guān)系。三個(gè)需求如下:
C: Consistency 一致性A: Availability 可用性P: Partition Tolerance分區(qū)容錯(cuò)性
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
而大部分 nosql 數(shù)據(jù)庫(kù)都在 C(一致性)上妥協(xié)了。
所以放棄外鍵是明智的。外鍵是為了保持所有的數(shù)據(jù)一致性,但是很多時(shí)候我們根本不需要數(shù)據(jù)是實(shí)時(shí)一致的,我們只需要保證最終一致性就可以了。
http://www.csdn.net/article/2...
http://duanple.blog.163.com/b...
回答2:1,現(xiàn)在互聯(lián)網(wǎng)基本不用外鍵.2,get set的問(wèn)題可以試試Lombok
回答3:我們?cè)趯?shí)際應(yīng)用中一般外鍵都是用程序去控制的。不在數(shù)據(jù)庫(kù)層面。
回答4:第一,關(guān)系型數(shù)據(jù)庫(kù)的外鍵(此處特指映射關(guān)系)還是很有用的第二,外鍵(此處特指外鍵約束)是不應(yīng)該存在的。
回答5:現(xiàn)在用外鍵的應(yīng)用越來(lái)越少了。 在10年前還是挺多的。 主要是業(yè)務(wù)獨(dú)立的考慮吧。 喜歡把業(yè)務(wù)完全放在應(yīng)用端,數(shù)據(jù)庫(kù)只是用來(lái)持久化使用的。
十多年前開始工作的時(shí)候的一些項(xiàng)目數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)也參與到業(yè)務(wù)當(dāng)中,但是后期發(fā)現(xiàn)維護(hù)起來(lái)很痛苦。后來(lái)項(xiàng)目維護(hù)的時(shí)候,為了能應(yīng)對(duì)所有問(wèn)題,不得不增加了數(shù)據(jù)庫(kù)專員。在項(xiàng)目總結(jié)中也提出這個(gè)問(wèn)題了。數(shù)據(jù)庫(kù)專員的成本很高的。
