V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
444683462
V2EX  ›  问与答

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

  •  
  •   444683462 · 2014-10-11 18:27:03 +08:00 · 10238 次点击
    这是一个创建于 3726 天前的主题,其中的信息可能已经有所发展或是发生改变。
    商品表
    id productname..........

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

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

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

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

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