自關聯:
- 表中的某一列,通過外鍵引用了本表的另外一列(主鍵),但是它們的業務邏輯含義又是不一樣的,這就是自關聯
- 物理上一張表,邏輯上是多張表,必須通過取別名來區分,能夠節省表的開銷
自關聯的應用場景:
我們設計了省(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 = '廣州市';
總結:
- 對於省市區、商品分類等這種結構上相同(或相近),並且具有包含關系的多張表,我們可以按照自關聯的方式給設計成一張表,能夠節省表的開銷