MySQL數據庫中一種表的設計方式——自關聯


自關聯:

  • 表中的某一列,通過外鍵引用了本表的另外一列(主鍵),但是它們的業務邏輯含義又是不一樣的,這就是自關聯
  • 物理上一張表,邏輯上是多張表,必須通過取別名來區分,能夠節省表的開銷


自關聯的應用場景:

  我們設計了省(provinces)信息的表結構(id,ptitle)和市(cities)信息的表結構(id,ctitle,pid)這兩張表,其中pid對應着provices表的id。通過比較發現,cities表比provinces表多一個列pid,其它列的類型都是一樣的,存儲的都是地區信息,而且每種信息的數據量有限,因此沒必要增加一個新表,或者將來還要存儲區、鄉鎮信息,都增加新表的開銷太大。我們可以重新設計一個地區(areas)信息的結構(id,atitle,pid),因為省沒有所屬的省份,所以pid可以填寫null,城市所屬的省份pid可以填寫省所對應的id。在這個表中,結構不變,還可以添加區縣、鄉鎮街道、村社區等信息。下面以創建areas表為例:

  • 創建areas表

    create table areas( id int primary key, atitle varchar(20), pid int, foreign key(pid) references areas(id) );
  • 從sql文件中導入數據

    source areas.sql;
  • 查詢山西省有哪些市

    select city.atitle from areas as province inner join areas as city on province.id = city.pid where province.atitle = '山西省';
  • 查詢廣州市有哪些區縣

    select district.atitle,country.atitle from areas as city inner join areas as district on city.id = district.pid 
    left join areas as country on district.id = country.pid where city.atitle = '廣州市';

總結

  • 對於省市區、商品分類等這種結構上相同(或相近),並且具有包含關系的多張表,我們可以按照自關聯的方式給設計成一張表,能夠節省表的開銷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM