书店系统ERD设计:图书与文具表价格字段设计咨询
书店系统ERD中价格字段的设计建议
1. 价格字段是否需要设为外键?
不需要。外键的核心作用是建立不同表之间的关联关系(比如book.category_id关联category.id),而price是商品自身的固有属性,属于每个业务表的独立字段——常规书店系统中,书籍和文具的价格都是各自商品的专属信息,没有对应的关联表需要绑定。强行把price设为外键只会增加不必要的关联复杂度,完全不符合外键的设计初衷。
2. 字段命名:用price还是BookPrice/StationaryPrice?
两种方式都可行,取决于团队的命名规范,但更推荐保持统一的price:
- 用
price的优势:字段语义清晰,每个表的price自然对应自身商品的价格,符合单一职责原则。跨表查询时只需通过表别名区分即可,比如:SELECT b.id, b.price AS book_price, s.id, s.price AS stationary_price FROM book b, stationary s WHERE b.price < 50 AND s.price < 30; - 用
BookPrice/StationaryPrice(更常见的是下划线命名book_price/stationary_price)的优势:跨表查询时无需别名,避免字段名冲突。但这种命名会让字段名冗余,因为表名已经明确了所属业务范畴。
如果团队没有强制要求前缀命名,优先选择简洁的price。
3. 额外的价格字段设计建议
- 数据类型选择:务必使用
DECIMAL(10,2)(可根据业务需求调整精度)存储价格,不要用FLOAT或DOUBLE,避免浮点数的精度丢失问题,确保货币计算准确。 - 约束设置:添加
NOT NULL约束(商品必须有定价),同时可以加CHECK(price >= 0)约束,防止出现负价格的不合理数据。 - 价格历史记录:如果业务需要跟踪价格变化(比如促销价、原价、调价记录),建议单独创建
price_history表,包含product_id(关联book或stationary的id)、product_type(区分是书籍还是文具)、price、effective_time、expire_time等字段,主表的price只存储当前生效的价格,既保持主表简洁,又能完整记录价格变更历史。 - 索引优化:如果经常有按价格范围筛选的查询(比如“找出所有50元以下的书籍”),可以给
price字段添加普通索引,提升查询效率。
内容的提问来源于stack exchange,提问作者Marrylind Grace Ann
相关产品推荐
相关产品推荐

