444683462
V2EX  ›  问与答

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

  •  
  •   444683462 · Oct 11, 2014 · 10718 views
    This topic created in 4262 days ago, the information mentioned may be changed or developed.
    商品表
    id productname..........

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

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

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

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

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