方案一
假设一个情景,你是小王,你的一个账户有3个外卖地址,分别送给自己,老板,老板娘,你的用户名叫高楼,密码是999999,因为你是这个app最先注册的,你的配送地址id包揽1、3、4。我是程序员小李,我看到这用户名和密码都是一样的,占了两个字段,如果还有电子邮件等等相同的信息,就会显得很冗杂~~(现在只有两个字段不是很明显)
user_info:
方案二
所以!!!我就要在数据库中建两个表,一个存放多个账户(包括用户名和密码等有重复可能的信息),一个存放相同账户的信息,
user_info:
address:
这就解决了冗杂的问题
但是这时候两表只是逻辑相关,而不是实际关联的,也就是说没有限制,比如一旦更改user_info的id331600,address中user_info_id就无所指,成为垃圾表,或者说在address中添加一个id,而这个id在user_info中不存在,即是一个空账户,所以这条信息没有用,也是垃圾信息
方案三
只要将user_info中的id与address中的user_info_id捆绑,建立锁定关系就可以解决方案二的问题,这就是外键的作用,将user_info_id设为外键,指向user_info的主键,可以保护数据完整性的作用:如果要删除的用户信息的id在address表中被使用(该账户设有地址),则该条数据无法删除(账户无法被删除);无法向address中添加不存在用户的地址信息(不能向空账户添加地址)
具体实现:
在创建address表时添加这样一行代码: constraint address_user_info_id_fk foreign key(user_info_id) references user_info(id)