素材牛VIP会员
一个简单的mysql数据问题
 多***悟  分类:SQL代码  人气:643  回帖:5  发布于6年前 收藏

people表
id peoplename

orders表
id productname people(请问这里存people的id还是直接复制字段)

直接放id的话,如果people被删除的话,怎么办?
直接复制字段的话,如果修改people表中的数据,同时也要修改orders表的数据对吗?

这两种理解对吗?
大家平时实际操作的时候怎么处理的

谢谢

讨论这个帖子(5)垃圾回帖将一律封号处理……

Lv7 码师
疯***了 学生 6年前#1

同意楼上的,people一般不会被删除。如果真的要删除people的话,可以在程序中增加事务管理,级联删除people和order,如果删除失败就回滚。或者只是使用外键,并增加级联删除的约束。

Lv6 码匠
yj***23 站长 6年前#2

第一选择放id, 加外键约束. 关于你说的"直接放id的话,如果people被删除的话,怎么办", mysql在外键约束上有三个选项:
1. CASCADE: people表删除, 相应的order表的 记录也被删掉;
2. SET NULL: people表删除, 相应的order表的 记录 的列被置空;
3. RESTRICT(NO ACTION): 如果order表有相应的记录, 则对people表的删除 不被允许.
见: http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

这大概可以解决你的问题了.

对存people直接复制字段, 除非这里的 people, order表操作 确实成为了性能瓶颈, 并且实测 直接复制字段 确实可以提高性能. 这样增加了冗余数据, 缺点: 1. 需要的存储空间增大; 2. 需要自己维护 order表和 people表的冗余字段.

Lv6 码匠
这***2 学生 6年前#3

应该是

people:    
    id 
    peoplename

orders:
    id
    productname
    pid       comment "people id"

如果people被删除,合理的话,相关的orders应该也被删除;保存的话,会产生冗余数据。
楼主,people有可能被删除了吗?用户一般不被删除。

Lv6 码匠
小***6 JS工程师 6年前#4

orders表存people的id,建议修改people表时不要直接删除,加一个inuse字段表示是否有效。

Lv6 码匠
西***护 UI设计师 6年前#5

建议设计表结构的初学者先学习下三范式

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取