关系型数据库的核心不是“有很多表”,而是:
这些表之间有清晰关系。
在“城市户籍总账”里,最自然的关系是:
districts 1 ---- n households 1 ---- n citizens也就是:
- 一个行政区下有很多户
- 一个户下有很多市民
- 一个市民属于一个户
ASCII 关系图:
[districts]
district_id (PK)
district_name
│ 1
│
└──── n
[households]
household_id (PK)
district_id (FK)
household_no
address
│ 1
│
└──── n
[citizens]
citizen_id (PK)
household_id (FK)
national_id (UNIQUE)
full_name再扩展一下关系模型的几种常见形态:
1. 一对一
citizens 1 --- 1 citizen_profiles适合把低频、扩展字段拆出去。
2. 一对多
households 1 --- n citizens这是最常见的主从关系。
3. 多对多
例如一个市民可以参加多个社区项目,一个项目也可以有多个市民参加。不能直接硬连,应该加中间表:
citizens n --- n community_programs
│
▼
citizen_programs关系模型的本质是:
别把所有信息揉成一张巨表,而是把“实体”与“关系”拆清楚。