小议“外键”
上圖是一幅很普通的外鍵關(guān)系示例,途中stu代表一個(gè)學(xué)生,category代表為學(xué)生建立的一個(gè)分類如:大學(xué)生、小學(xué)生、初中生。如果stu中的category_id不允許為空,那么在出入stu記錄前必須保證此category_id 的存在,這個(gè)我想誰都沒有問題。那么插入stu前該做哪些事情呢,必須知道當(dāng)前的stu屬于那個(gè)類別,如果category_id可以為恐則不需要這么做,換句話說插入stu記錄中凡是有category_id的記錄必須先做檢查,如果此category不存在要先插入。
這個(gè)時(shí)候另一個(gè)問題出來了,有的人說插入了category但是不知道它的id,因?yàn)閕d是由數(shù)據(jù)庫自動(dòng)維護(hù)的。其實(shí)這個(gè)根本不是問題,它是另一個(gè)問題的表象。因?yàn)閕d是用來標(biāo)識(shí)一張表的,而實(shí)際上category的名字也是用來唯一標(biāo)識(shí),準(zhǔn)確的說id是次要的。我們把上邊這張表完全可以簡化為一張表,也就是帶category_title的stu表,如果只是一個(gè)字段那么冗余度沒那么高,當(dāng)字段多了,冗余度就非常高了,為了降低冗余度但又不破壞數(shù)據(jù)的關(guān)系,所以才有了上面兩張表的格局,這個(gè)時(shí)候我們唯一冗余的就是一個(gè)32位的整型字段,忽略不計(jì)。當(dāng)然有人提出了更好的、代替32位整型的數(shù)據(jù)類型作為id,在此我們不做累述。那么回到剛才的問題,插入了category后是不知道當(dāng)前插入了記錄的id(如果你說按時(shí)間查詢,首先這很蠢,而且沒道理,我相信大部分人不會(huì)這么干,比如有很多并發(fā)請(qǐng)求的時(shí)候可能查詢出的是別人的記錄。),但是有stu的記錄,根據(jù)stu查出它的類型,然后存儲(chǔ),說的詳細(xì)點(diǎn),也就是說出這個(gè)問題的人是在設(shè)計(jì)上出現(xiàn)了問題。
總結(jié)
- 上一篇: 网络系统工程师的最终归宿(一)创业还是打
- 下一篇: STP生成树连载:制服网络广播风暴(1)