作者回复: 对的
作者回复: 订单表冗余了商品的名称,如果修改了商品名称,我们一般不会再去修改订单中的冗余数据了。
商品是有唯一标识的,商品的具体名称的修改,其实是不会影响到用户的体验,如果商品名称修改比较大,会影响到用户体验了,这个时候我们建议下架商品,上架一个新的商品。
作者回复: 收到
作者回复: 我们在新建表时,DBA会要求innodb存储引擎的表中,默认需要配置自增主键ID,并且该主键ID耦合在业务中。使用自增主键主要是因为innodb中的主键索引是聚族索引,B+树中的叶子节点存储了行数据,数据记录本身被存于主索引的叶子节点上,同一个叶子节点内的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置。如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
如果使用非自增主键,由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构。
DBA要求自增主键ID不参与业务,主要考虑后续数据迁移的难度。
作者回复: redis mongodb 以及es这些
作者回复: 一个公共表存储商品的共同信息,例如商品的sku 编码、价格、图片地址、商品类型等,这些字段都是所有商品都有的属性。
而一些分的比较细的属性,例如商品颜色、尺寸、材料、品牌等信息则可以存储在键值对数据库。
作者回复: 这几条规则已经是行业内的标准规则,值得借鉴
作者回复: 以订单的某个列作为hash,通过hash求余或一致性哈希算法来分表,例如 数据A和数据B,水平分表后就会放到两张表中;
垂直分表则是将一张表的一些列分开到另外一张表中,例如,订单表有 订单号、付款金额、付款时间等,如果将付款金额和付款时间单独为另外一张表,这种情况就是垂直分表。
作者回复: 这块比较理论,有什么不懂的可以细节问我
作者回复: 例如,订单表和详细订单表中,如果是物理关联的情况下,是以订单表的ID关联详细订单表外键orderID。
在逻辑上关联的意思就是,在没有任何业务操作的情况下,详细订单表依然有orderID字段,只是我们不需要再物理关联订单表ID了。一旦有业务操作,我们记得在业务层将两张表的操作关联起来,例如,删除主订单,此时记得删除详细订单表。
作者回复: 第一个疑问,商家的订单表可用冗余数据来实现,商家查看的一套数据存放在键值对数据库;第二个问题,如果商品数据量比较大,我们可将商品存放在Elasticsearch、Solr。
作者回复: 会存在死锁的可能👍🏻
作者回复: 对的,用逻辑关联来保证各个表数据的一致性。
作者回复: 是的,即麻烦又影响性能。