外键替代方案咨询:book与author表的关联及统计问题
问题解答
能否建立键关系?
可以建立逻辑关联,但不适合用严格的外键约束(因为你允许book表存在author表中没有的作者)。推荐两种实用方案:
- 给
author.name加唯一索引,book.author_name加普通索引:既不限制book插入未匹配的作者,又能大幅提升连接查询的性能,同时避免author表出现重复作者名。 - 引入
author.id作为关联键:给book表新增author_id字段,外键关联author.id(设置为可空),同时保留book.author_name作为冗余字段。插入书籍时,先匹配author.name,找到对应作者就填充author_id,找不到则留空author_id、仅填充author_name。这种方式兼顾了数据规范和业务灵活性。
如何统计每位作者的书籍数量?
不管有没有建立键关系,都可以通过左连接查询实现统计,确保author表中所有作者都被统计(包括没有书籍的作者,数量显示为0):
SELECT a.name, COUNT(b.id) AS book_count FROM author a LEFT JOIN book b ON a.name = b.author_name GROUP BY a.name;
如果用了author_id关联,就把连接条件改成a.id = b.author_id即可。
是否应该让两张表完全独立?
不建议完全独立。完全独立会导致:
- 查询性能差:每次统计都需要全表扫描并连接,数据量大时效率极低。
- 数据一致性风险:比如
author表中作者名称修改后,book表中旧名称的记录无法同步,会导致统计结果错误。
内容的提问来源于stack exchange,提问作者Coder Sam
相关产品推荐
相关产品推荐

