數(shù)據(jù)庫(kù)(5)---數(shù)據(jù)庫(kù)系統(tǒng)的實(shí)現(xiàn)

【聲明】本文章來(lái)自穆晨 - 博客園弱恒,記錄于此方便后期的學(xué)習(xí)和查閱

一射亏、前言

雖說(shuō)數(shù)據(jù)庫(kù)系統(tǒng)的具體實(shí)現(xiàn)因業(yè)務(wù)環(huán)境虫腋,RDBMS等因素而異莽红,但總體開(kāi)發(fā)流程妥畏,以及開(kāi)發(fā)過(guò)程中所涉及到的一些問(wèn)題,也具有不少統(tǒng)一的套路安吁、標(biāo)準(zhǔn)咖熟。

本文主要討論數(shù)據(jù)庫(kù)系統(tǒng)實(shí)現(xiàn)過(guò)程中的重點(diǎn)環(huán)節(jié)、基本開(kāi)發(fā)流程柳畔、數(shù)據(jù)庫(kù)管理以及數(shù)據(jù)質(zhì)量工程等話題奈懒。

二、參照完整性約束對(duì)更新刪除操作的影響

第3篇中已經(jīng)討論過(guò)鲫趁,關(guān)系設(shè)計(jì)的目的就是為了減少冗余丧凤,消除更新異常。但當(dāng)時(shí)也留下一個(gè)問(wèn)題:外碼冗余時(shí)俘陷,該如何解決呢罗捎?

關(guān)系數(shù)據(jù)庫(kù)理論將外碼冗余的問(wèn)題交給了RDBMS,讓它來(lái)解決涉及外碼的更新異常拉盾。如下存在外碼的關(guān)系中:

關(guān)系EMPLOYEE中的Dept屬性是一個(gè)外碼桨菜,它對(duì)應(yīng)DEPARTMENT關(guān)系的主碼。如果對(duì)該屬性進(jìn)行更新或者刪除捉偏,那么這個(gè)外碼就找不到它對(duì)應(yīng)的主碼倒得,兩個(gè)關(guān)系的聯(lián)系就被破壞了。針對(duì)這個(gè)問(wèn)題夭禽,RDBMS的解決方案有四個(gè)霞掺,下面以刪除異常為例進(jìn)行說(shuō)明:
  • 限制刪除:指如果某記錄主碼被另一個(gè)記錄外碼對(duì)應(yīng),則該記錄不允許被刪除讹躯。如上面示例DEPARTMENT關(guān)系中的記錄在刪除的時(shí)候有可能被RDBMS禁止菩彬。

  • 級(jí)聯(lián)刪除:指如果某個(gè)記錄的主碼被另一個(gè)記錄的外碼對(duì)應(yīng)缠劝,那么這兩個(gè)記錄將一起被刪除。

  • 設(shè)置為空:指如果某個(gè)記錄的主碼被另一個(gè)記錄的外碼對(duì)應(yīng)骗灶,那么在刪除這個(gè)記錄后惨恭,另外那個(gè)記錄的外碼字段設(shè)置為空。

  • 設(shè)置默認(rèn)值:同“設(shè)置為空”耙旦,不過(guò)是將設(shè)置為空改為設(shè)置成一個(gè)默認(rèn)值脱羡。

更新情況和刪除一樣,要注意的是所有處理都發(fā)生在對(duì)外碼映射中的非外碼關(guān)系進(jìn)行操作時(shí)發(fā)生母廷。這些處理主要是對(duì)外碼關(guān)系進(jìn)行附加操作轻黑,如級(jí)聯(lián)刪除,置空琴昆,置默認(rèn)值氓鄙,或者報(bào)錯(cuò)。

三业舍、索引機(jī)制

索引(index)機(jī)制的本質(zhì)是一種檢索加速機(jī)制抖拦,本文將從索引的邏輯意義上對(duì)它進(jìn)行解析,至于其在各RDBMS里的物理實(shí)現(xiàn)細(xì)節(jié)則不做介紹舷暮。如下客戶關(guān)系表中:

由于CustID是按順序排列的态罪,如果要檢索某CustID值對(duì)應(yīng)的記錄,可使用多種查找算法提高檢索效率下面,如二分查找等复颈。但關(guān)系中某一列排好序以后,其他列必然是亂序的沥割,那如何解決耗啦?在RDBMS中,這種情況可以通過(guò)新建一個(gè)只包含兩列的附加表來(lái)實(shí)現(xiàn):

索引表中机杜,其中一列為索引字段帜讲,另一列則包含一個(gè)指針指向原紀(jì)錄。這樣在對(duì)索引列進(jìn)行查詢的時(shí)候椒拗,RDBMS會(huì)先對(duì)索引表進(jìn)行操作似将,完了再映射到原表并返回結(jié)果。

從本質(zhì)上來(lái)說(shuō)蚀苛,這是一種犧牲空間換取時(shí)間的辦法在验,索引建立不單耗費(fèi)存儲(chǔ)資源,而且會(huì)降低更新枉阵、刪除等操作的效率译红。因此不是說(shuō)建的索引越多就越好,具體建立何種索引兴溜,建立多少索引侦厚,則要取決于計(jì)算資源,RDBMS拙徽,業(yè)務(wù)場(chǎng)景等因素刨沦。

四、觸發(fā)器機(jī)制

觸發(fā)器是一種規(guī)則膘怕,當(dāng)關(guān)系中刪除想诅、插入、修改一條記錄的時(shí)候執(zhí)行岛心。它的應(yīng)用場(chǎng)景很多来破,如:每次向關(guān)系表中插入記錄后,更新記錄總數(shù)忘古,如果超過(guò)了n徘禁,則不再插入數(shù)據(jù)。幾乎所有RDBMS都提供了該功能髓堪。

觸發(fā)器的代碼送朱,不是標(biāo)準(zhǔn)SQL代碼,不必細(xì)究干旁。觸發(fā)器實(shí)現(xiàn)代碼的語(yǔ)法規(guī)則取決于RDBMS驶沼,需要時(shí)再有針對(duì)性的參考手冊(cè)即可。

五争群、數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)流程

數(shù)據(jù)庫(kù)系統(tǒng)(database system):指讓用戶和數(shù)據(jù)庫(kù)信息之間進(jìn)行有效交互的計(jì)算機(jī)系統(tǒng)回怜。其典型的框架如下圖所示:

數(shù)據(jù)庫(kù)系統(tǒng)的三大主要部分:數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)管理軟件(RDBMS)换薄、前端應(yīng)用程序(Web/APP等)玉雾。

數(shù)據(jù)庫(kù)是數(shù)據(jù)庫(kù)系統(tǒng)的核心,負(fù)責(zé)存放所有數(shù)據(jù)专控。而數(shù)據(jù)庫(kù)對(duì)外的所有交互抹凳,均通過(guò)RDBMS來(lái)進(jìn)行。一般用戶通過(guò)前端應(yīng)用程序使用RDBMS伦腐,而比較專業(yè)的用戶也可直接使用RDBMS操縱數(shù)據(jù)庫(kù)赢底。

舉例來(lái)說(shuō),某人通過(guò)APP訂購(gòu)商品柏蘑,那么這個(gè)APP就是前端應(yīng)用程序幸冻,而當(dāng)她有一個(gè)具體行為,比如付款的時(shí)候咳焚,前段應(yīng)用程序就會(huì)和RDBMS通信洽损,讓RDBMS完成扣款,并返回操作執(zhí)行結(jié)果革半。

數(shù)據(jù)庫(kù)系統(tǒng)的開(kāi)發(fā)流程碑定,總體可以劃分為以下幾個(gè)步驟:
1. 數(shù)據(jù)庫(kù)需求

需求搜集是所有環(huán)節(jié)中最重要的一步流码。通常,都會(huì)通過(guò)ER圖進(jìn)行表示延刘,并和各業(yè)務(wù)方討論搜集得到漫试,最終整理成文檔。這些需求將指導(dǎo)后面的工作碘赖,如:需求建模驾荣、數(shù)據(jù)庫(kù)實(shí)現(xiàn)、以及前端應(yīng)用程序開(kāi)發(fā)等普泡。

特別強(qiáng)調(diào)播掷,數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)需求階段,其過(guò)程是循環(huán)迭代式的撼班,一開(kāi)始的需求集并不大歧匈,但隨著項(xiàng)目的進(jìn)展,需求會(huì)越來(lái)越多权烧。但不論是以上哪個(gè)階段發(fā)生了需求變動(dòng)眯亦,整個(gè)流程都需要重新走一遍,決不允許隱式變更需求般码。

2. 數(shù)據(jù)庫(kù)建模

數(shù)據(jù)庫(kù)建模階段妻率,即邏輯模型建模,在本系列文章的第2篇已詳細(xì)講解板祝,這里不再贅述宫静。

3. 數(shù)據(jù)庫(kù)實(shí)現(xiàn)

這一步的本質(zhì)就是在空的RDBMS里實(shí)現(xiàn)2中創(chuàng)建的關(guān)系模型,一般通過(guò)使用SQL或者RDBMS提供的前端工具實(shí)現(xiàn)券时。

4. 開(kāi)發(fā)前端應(yīng)用程序

前端應(yīng)用開(kāi)發(fā)孤里,在需求搜集好之后就開(kāi)始進(jìn)行了,主要有網(wǎng)站橘洞、APP等前端形式捌袜,由于前端程序的實(shí)際實(shí)現(xiàn)涉及到和數(shù)據(jù)庫(kù)之間交互,因此這一步的最終完成在數(shù)據(jù)庫(kù)建模之后炸枣。

5. 數(shù)據(jù)庫(kù)部署

這一步就是部署數(shù)據(jù)庫(kù)系統(tǒng)的軟硬件環(huán)境虏等。還包含將初始數(shù)據(jù)填入數(shù)據(jù)庫(kù)中。對(duì)于云數(shù)據(jù)倉(cāng)庫(kù)适肠,這一步就叫"數(shù)據(jù)上云"霍衫。

6. 數(shù)據(jù)庫(kù)使用
7. 數(shù)據(jù)庫(kù)管理和維護(hù)

嚴(yán)格來(lái)講,這部分不算開(kāi)發(fā)流程侯养,屬于數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)完成后的工作敦跌。接下來(lái)本文將圍繞這個(gè)話題進(jìn)行講解。

六逛揩、數(shù)據(jù)庫(kù)系統(tǒng)管理

數(shù)據(jù)庫(kù)系統(tǒng)發(fā)行后柠傍,控制權(quán)便從數(shù)據(jù)庫(kù)設(shè)計(jì)麸俘、實(shí)現(xiàn)、部署的團(tuán)隊(duì)携兵,移交給了數(shù)據(jù)庫(kù)管理員(database administrator, DBA)疾掰,并由他們來(lái)對(duì)系統(tǒng)進(jìn)行管理搂誉。

數(shù)據(jù)庫(kù)管理涵蓋了確保一個(gè)已經(jīng)部署的數(shù)據(jù)庫(kù)系統(tǒng)正確運(yùn)行的各種行為徐紧。主要包含以下范疇:

這部分工作的涉及面相當(dāng)廣而深,應(yīng)由專業(yè)的DBA團(tuán)隊(duì)去完成炭懊。本文主要針對(duì)人群是數(shù)據(jù)科學(xué)家并级,因此僅對(duì)這些工作做一個(gè)簡(jiǎn)明的介紹。

1. 數(shù)據(jù)庫(kù)系統(tǒng)監(jiān)測(cè)與維護(hù)

DBA需要監(jiān)測(cè)數(shù)據(jù)庫(kù)系統(tǒng)的運(yùn)行情況侮腹,并針對(duì)發(fā)現(xiàn)的問(wèn)題進(jìn)行維護(hù)嘲碧。比如發(fā)現(xiàn)存儲(chǔ)資源不夠用了,則要分配給數(shù)據(jù)庫(kù)系統(tǒng)更多存儲(chǔ)空間等父阻。

DBA需要掌握數(shù)據(jù)庫(kù)中各關(guān)系的具體使用情況愈涩,從而進(jìn)行優(yōu)化。比如某兩個(gè)表被很多用戶頻繁使用加矛,并只用來(lái)重復(fù)創(chuàng)建相同的報(bào)表履婉。這時(shí)候DBA就可以考慮建議數(shù)據(jù)庫(kù)開(kāi)發(fā)團(tuán)隊(duì)反規(guī)范化設(shè)計(jì)的將這兩個(gè)表合并到一起。

2. 數(shù)據(jù)庫(kù)安全保障

安全保障工作斟览,是數(shù)據(jù)庫(kù)系統(tǒng)管理工作中的首要任務(wù)毁腿,該任務(wù)需要DBA對(duì)數(shù)據(jù)的存取過(guò)程嚴(yán)加控制,包括:數(shù)據(jù)庫(kù)訪問(wèn)人員的賬戶認(rèn)證苛茂、權(quán)限劃分已烤、敏感數(shù)據(jù)的加密等。

3. 數(shù)據(jù)庫(kù)備份與恢復(fù)

數(shù)據(jù)庫(kù)的數(shù)據(jù)妓羊,是存放在計(jì)算機(jī)的物理磁盤(pán)里胯究,而計(jì)算機(jī)對(duì)數(shù)據(jù)的處理過(guò)程,都是先把數(shù)據(jù)從硬盤(pán)轉(zhuǎn)移到內(nèi)存躁绸,處理完后再存放回去裕循。

如果數(shù)據(jù)在內(nèi)存中進(jìn)行處理,還沒(méi)有將數(shù)據(jù)轉(zhuǎn)移回磁盤(pán)的時(shí)候涨颜,數(shù)據(jù)庫(kù)掛了的話就將導(dǎo)致數(shù)據(jù)丟失费韭。因此RDBMS采用恢復(fù)日志(recovery log)機(jī)制,先記錄更新操作要做的事情庭瑰,比如那個(gè)數(shù)據(jù)被更新星持,更新前后的值,更新請(qǐng)求的用戶等弹灭,然后再做具體的更新操作督暂。在更新日志中可以設(shè)置"檢查點(diǎn)"揪垄,之后DBA可使用它進(jìn)行周期性副本備份。失效事件發(fā)生之后逻翁,DBA可以利用"檢查點(diǎn)"進(jìn)行系統(tǒng)恢復(fù):回滾(Roll Back)至指定檢查點(diǎn)狀態(tài)饥努。

對(duì)于那種徹底性毀壞的情況,比如發(fā)生火災(zāi)八回、地震等酷愧,可在多個(gè)不同物理站點(diǎn)上保留完全鏡像備份(complete mirrored backup)。這些副本需持續(xù)更新保證與數(shù)據(jù)庫(kù)系統(tǒng)一致缠诅。

4. 數(shù)據(jù)庫(kù)性能優(yōu)化

性能優(yōu)化包括:設(shè)置索引溶浴、逆規(guī)范化、SQL優(yōu)化等管引,通常用QPS(query per second)等指標(biāo)來(lái)衡量數(shù)據(jù)庫(kù)系統(tǒng)的優(yōu)化效果士败。

這部分工作內(nèi)容很多也比較雜,主要通過(guò)DBA管理RDBMS的查詢優(yōu)化器來(lái)完成褥伴。但對(duì)于數(shù)據(jù)庫(kù)的開(kāi)發(fā)員和使用者來(lái)說(shuō)谅将,也多多少少要知道一點(diǎn),比如寫(xiě)Hive語(yǔ)句時(shí)重慢,需要靈活設(shè)置分區(qū)饥臂,避免數(shù)據(jù)傾斜等。

5. 數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)制定

這部分工作包括數(shù)據(jù)庫(kù)中字段命名規(guī)范伤锚、SQL編碼規(guī)范的制定等擅笔。除了這些開(kāi)發(fā)標(biāo)準(zhǔn),還有使用標(biāo)準(zhǔn)屯援,比如使用數(shù)據(jù)庫(kù)的人需要遵守哪些有益于數(shù)據(jù)庫(kù)系統(tǒng)健康的行為規(guī)范等猛们。

七、數(shù)據(jù)質(zhì)量體系

數(shù)據(jù)庫(kù)系統(tǒng)狞洋,以及數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)弯淘,都需要始終重視數(shù)據(jù)質(zhì)量問(wèn)題。一句話概括:數(shù)據(jù)質(zhì)量就是衡量數(shù)據(jù)能否真實(shí)吉懊、及時(shí)反映客觀世界的指標(biāo)庐橙。

具體來(lái)說(shuō),數(shù)據(jù)質(zhì)量包含以下幾大指標(biāo):
1. 準(zhǔn)確性

準(zhǔn)確性要求數(shù)據(jù)能夠正確描述客觀世界借嗽。比如某用戶姓名拼音mu chen态鳖,錯(cuò)誤的錄入成了muc hen,就應(yīng)該彈出警告語(yǔ)恶导。

2. 唯一性

唯一性要求數(shù)據(jù)不能被重復(fù)錄入浆竭,或者不能有兩個(gè)幾乎相同的關(guān)系。比如張三李四在不同業(yè)務(wù)環(huán)境下分別建立了近乎相同的關(guān)系,這時(shí)應(yīng)將這兩個(gè)關(guān)系合并邦泄。

3. 完整性

完整性要求進(jìn)行數(shù)據(jù)搜集時(shí)删窒,需求數(shù)據(jù)的被描述程度要高。比如一個(gè)用戶的購(gòu)買記錄中顺囊,必然要有支付金額這個(gè)屬性肌索。

4. 一致性

一致性要求不同關(guān)系、或者同一關(guān)系不同字段的數(shù)據(jù)意義不發(fā)生沖突特碳。比如某關(guān)系中昨天存貨量字段+當(dāng)天進(jìn)貨量字段-當(dāng)天銷售量字段等于當(dāng)天存貨量诚亚,否則就可能是數(shù)據(jù)質(zhì)量有問(wèn)題。

5. 及時(shí)性

及時(shí)性要求數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù)"保鮮"测萎。比如當(dāng)天的購(gòu)買記錄當(dāng)天就要入庫(kù)亡电。

6. 統(tǒng)一性

統(tǒng)一性要求數(shù)據(jù)格式統(tǒng)一。比如nike這個(gè)品牌硅瞧,不能有的字段描述為"耐克",而有的字段又是"奈克"恕汇。

數(shù)據(jù)質(zhì)量和數(shù)據(jù)具體意義有很大相關(guān)性腕唧,因此無(wú)法單憑數(shù)據(jù)庫(kù)理論來(lái)保證。且由于具體業(yè)務(wù)及真實(shí)世界的復(fù)雜性瘾英,數(shù)據(jù)質(zhì)量問(wèn)題必然會(huì)存在枣接,不可能完全預(yù)防得了。因此很多RDBMS或第三方公司都提供了數(shù)據(jù)質(zhì)量工程服務(wù)/軟件缺谴,用來(lái)識(shí)別和校正數(shù)據(jù)庫(kù)系統(tǒng)中的各種數(shù)據(jù)質(zhì)量問(wèn)題但惶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市湿蛔,隨后出現(xiàn)的幾起案子膀曾,更是在濱河造成了極大的恐慌,老刑警劉巖阳啥,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件添谊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡察迟,警方通過(guò)查閱死者的電腦和手機(jī)斩狱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扎瓶,“玉大人所踊,你說(shuō)我怎么就攤上這事「藕桑” “怎么了秕岛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓣蛀,道長(zhǎng)陆蟆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任惋增,我火速辦了婚禮叠殷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诈皿。我一直安慰自己林束,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布稽亏。 她就那樣靜靜地躺著壶冒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪截歉。 梳的紋絲不亂的頭發(fā)上胖腾,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音瘪松,去河邊找鬼咸作。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宵睦,可吹牛的內(nèi)容都是我干的记罚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼壳嚎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼桐智!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起烟馅,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤说庭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后焙糟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體口渔,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年穿撮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缺脉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悦穿,死狀恐怖攻礼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栗柒,我是刑警寧澤礁扮,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布知举,位于F島的核電站,受9級(jí)特大地震影響太伊,放射性物質(zhì)發(fā)生泄漏雇锡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一僚焦、第九天 我趴在偏房一處隱蔽的房頂上張望锰提。 院中可真熱鬧,春花似錦芳悲、人聲如沸立肘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谅年。三九已至,卻和暖如春肮韧,著一層夾襖步出監(jiān)牢的瞬間融蹂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工惹苗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殿较,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓桩蓉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親劳闹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子院究,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345