商品表与订单表关系问题?

2014-10-11 18:27:03 +08:00
 444683462
商品表
id productname..........

订单表
id productname(问题 这里是直接放id,还是放productname)

大部分说法都是直接放商品id到订单表。
但是如果这个商品我删除了呢,订单岂不是也完蛋了,对应的商品就看不到了。
如果直接复制商品表的productname字段到订单表productname,就不用外键。

顺便大家简介一下外键怎么用,是不是就是join那个语句
10132 次点击
所在节点    问与答
18 条回复
virusdefender
2014-10-11 18:38:08 +08:00
类似淘宝保存商品快照
444683462
2014-10-11 18:38:36 +08:00
@virusdefender 大哥 清楚一点啊
mhycy
2014-10-11 18:39:37 +08:00
所有商品不做实际删除,仅作删除标记
为了日后快照需要,每次更新都是一个新的副本,如果这个副本没有任何引用,可以直接覆盖
444683462
2014-10-11 18:40:55 +08:00
@mhycy 删除我能理解。
“每次更新都是一个新的副本,如果这个副本没有任何引用,可以直接覆盖”这句话怎么理解
mhycy
2014-10-11 18:46:09 +08:00
@444683462
设想这么一个场景:
某商家上架了一个商品 假设ID:10050
然后半小时后更新了一些图片和说明.

更新的那个商品,实际上,如果在更新与上架期间有客户购买的话,这个商品的更新将不会在原纪录操作,而是标记成失效/过期,10050这个id将会存在于这些订单中.
更新的数据将会写入到一条新的商品条目,对外ID可以一致,但是内部ID必须更新.
(对外id:2205,内部id:10051)
Mac
2014-10-11 20:18:14 +08:00
设计思路问题,商品表就只是个商品表,没事不要去删除。
另做进销的表,算库存再决定订单是否能下单。
能不用外键尽量别用外键,用表链接 JOIN。
444683462
2014-10-11 20:23:05 +08:00
@mhycy 有点感觉了。非常感谢。请问有没这方面的资料。对外对内的id如何编写数据库,有没成熟的构架。抄袭一下
Mac
2014-10-11 20:25:23 +08:00
@mhycy 对于你这个场景,你可以把订单表设计成字段包含所有商品描述的字段,例如
商品表:ID,商品名称,商品规格,商品单价
订单表:ID,商品表对应ID,件数,商品名称,商品规格,商品单价,订单日期,下单人,下单地址,BLABLABLA

在程序中生成订单表记录的时候,就直接插入当前商品表关于商品的描述属性,商品表再怎么变,订单表是不会变的,别用外键。
444683462
2014-10-11 20:33:51 +08:00
@Mac 表链接join与外键什么关系 不是差不多的东西么
Mac
2014-10-11 20:51:51 +08:00
@444683462 外键是用来做外键约束的,是数据库层面的自动操作,你用外键约束简化了你编写CRUD的操作,但不利于你将来对库进行变更和增加或减少约束项。表链接只是用关键字段将几不同的表联系起来,各种CRUD的操作都是在你程序层面进行的,比较灵活和自由。我以前也是用外键,但实际使用中,发生很多问题,比如我要更改某条记录中被约束的字段,就会发生错误。后来改用表链接,所有联动的CRUD都在程序中完成,各种舒爽。关于表链接,你可以看看这篇BLOG http://my.oschina.net/gschen/blog/229034
444683462
2014-10-11 21:08:50 +08:00
@Mac 非常感谢你。请问下关于电子商务的数据库设计,类似淘宝保存商品快照有没合适的文章。
Mac
2014-10-11 21:37:47 +08:00
@444683462 我觉得你最好先认真的学一下SQL基本的CRUD操作如何用你编写的语言来实现。淘宝的商品快照其实很简单,即在订单表中保存所有下单时所有链接表的相关字段,只是字段的堆砌而已,没有什么复杂的东西。
444683462
2014-10-11 21:52:38 +08:00
@Mac 商品快照我可不可以理解成 更新就是新插一个商品。
444683462
2014-10-11 21:52:45 +08:00
@virusdefender 商品快照我可不可以理解成 更新就是新插一个商品。
Mac
2014-10-11 22:03:59 +08:00
@444683462 你可以建立一个只保存商品快照的表,在生成订单的时候,再做一个插入动作,采集所有当前商品信息的字段,插入到这个表里。用客户下单的订单号作为关联字段。调用快照的时候就直接读这个表的内容即可。
444683462
2014-10-11 22:10:07 +08:00
@Mac 每次下单的话都生成。不如每次更新商品的时候,新插一个商品。这样会不会更好。会不会引起其他问题
Mac
2014-10-11 22:19:09 +08:00
@444683462 数据库肯定是金字塔化的最为合理,你这样做等于把腰弄的很肥,与订单的关西变成互为自子集,尽量避免这种设计,关系交叉的太频繁。不利于将来的扩展和修改。
virusdefender
2014-10-12 10:47:13 +08:00
其实主要看你的使用场景了,简单的网站就复制一下商品的名字价格单位介绍到商品快照就行了,商品也不要删除,使用下架功能就行了。至少我是这么用的。复杂的你要所想做到京东淘宝那样就麻烦去了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX