mysql 商品规格表_商品规格分析

产品表每次更新商品都会变动的,ID不能用,可是购物车还是用了,这就导致每次保存商品,哪怕什么都没有改动,也会导致用户的购物车失效。

~~~

其实可以考虑不是每次更新商品就除所有的SKU,毕竟有时什么都没修改呢,只改一个价格呢,或者增加一个SKU呢,其实这个问题做细一点有好的处理方式的。

比如商品增加一个版本号字段,SKU也增加一个版本字段,如果SKU规格值变动了那么删除,如果发现规格值还在,只是价格或其它的改变了,那么则只需要改变版本号就可以了,但其实这里面的细节很多,考虑得比较麻烦,还是干脆不要用SKU的ID了,如果能不用SKU的ID,那就全部都不要用,购物车里面也只记录商品的ID和规格字符串就可以了,根据规格字符串查询SKU,如果找不到那就是没有。

~~~

规格不是属于模型,而是模型有个字段可以包含多个规格。多个规格值使用json编码保存。

属性是属于模型的。多个属性值使用逗号分隔。

商品展示时规格怎么获取,跟后台可不一样,后台是可以看到模型下面的所有规格,但不一地你给选用该规格,而前台是要展现所有SKU,请注意这个区别。

iwebshop是将商品的所有规格组(SKU)都放入了goods表,显示时使用了这儿的数据。而tpshop是从sku表中获取的。

classes/goods_class.php 119 line

~~~

//是否存在货品

$goodsUpdateData['spec_array'] = '';

if(isset($postData['_spec_array']))

{

//生成goods中的spec_array字段数据

$goods_spec_array = array();

foreach($postData['_spec_array'] as $key => $val)

{

foreach($val as $v)

{

$tempSpec = JSON::decode($v);

if(!isset($goods_spec_array[$tempSpec['id']]))

{

$goods_spec_array[$tempSpec['id']] = array('id' => $tempSpec['id'],'name' => $tempSpec['name'],'type' => $tempSpec['type'],'value' => array());

}

$goods_spec_array[$tempSpec['id']]['value'][] = $tempSpec['value'];

}

}

foreach($goods_spec_array as $key => $val)

{

$val['value'] = array_unique($val['value']);

$goods_spec_array[$key]['value'] = join(',',$val['value']);

}

$goodsUpdateData['spec_array'] = JSON::encode($goods_spec_array);

}

~~~

products.html 模板

~~~

{if:$spec_array}

{set:$specArray = JSON::decode($spec_array);}

{foreach:items=$specArray}

{$item['name']}
{set:$specVal=explode(',',trim($item['value'],','))}

{foreach:items=$specVal item=$spec_value}

{if:$item['type'] == 1}

  • {$spec_value}

{else:}

%7Bwebroot:%24spec_value%7D

{/if}

{/foreach}

{/foreach}

{/if}

~~~

* * * * *

### 扩展讨论:标类与非标

当商品比较容易标准化,规范化时使用类型来决定规格这种形式比较好(根据商品类型定义规格模型),但是有一些场景这样就不太灵活了,比如当商品很难标准化,规范化时,比如外卖的餐品,不是每一个餐品都有规格,都有辣度规格,大份小份等规格,所以此时应该寻找另外一种解决方案了,比如使用自定义的规格,这样就灵活很多了,这里就有个很好的实例:[这是商品不依赖类型,自定义规格的完美解决方案!](https://coding.net/u/xiasf/p/gcb/git/commit/6d4116b91cc05e4db483e9eb49bd58611510f0e5#commit-comment-91257) ,当然如果情况复杂特殊,使用两种方式结合也是我们愿意看到的,不过设计起来可能比较复杂,以后有实际案例再讨论。

* * * * *

update:2017-3-16 11:18:03

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1:Transformers模型 原文:TRANSFORMER MODELS 本课程会通过 Hugging Face 生态系统中的一些工具包,包括 Transformers, Datasets, Tokenizers, Accelerate 和 Hugging Face Hub。…

隐马尔可夫模型HMM推导

隐马尔可夫模型HMM推导 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM(Hidden Markov Model) 课程笔记 背景介绍 介绍一下频率派和贝叶斯派两大流派发展出的建模方式。 频率派 频率派逐渐发展成了统计机器学习,该流派通常将任务建模为一…

使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...

Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水…

huggingface NLP工具包教程2:使用Transformers

huggingface NLP工具包教程2:使用Transformers 引言 Transformer 模型通常非常大,由于有数百万到数百亿个参数,训练和部署这些模型是一项复杂的任务。此外,由于几乎每天都有新模型发布,而且每个模型都有自己的实现&a…

mysql精讲_Mysql 索引精讲

开门见山,直接上图,下面的思维导图即是现在要讲的内容,可以先有个印象~常见索引类型(实现层面)索引种类(应用层面)聚簇索引与非聚簇索引覆盖索引最佳索引使用策略1.常见索引类型(实现层面)首先不谈Mysql怎么实现索引的,先马后炮一…

RT-Smart 官方 ARM 32 平台 musl gcc 工具链下载

前言 RT-Smart 的开发离不开 musl gcc 工具链,用于编译 RT-Smart 内核与用户态应用程序 RT-Smart musl gcc 工具链代码当前未开源,但可以下载到 RT-Thread 官方编译好的最新的 musl gcc 工具链 ARM 32位 平台 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

OpenAI Whisper论文笔记

OpenAI Whisper论文笔记 OpenAI 收集了 68 万小时的有标签的语音数据,通过多任务、多语言的方式训练了一个 seq2seq (语音到文本)的 Transformer 模型,自动语音识别(ASR)能力达到商用水准。本文为李沐老师…

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 转自:【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 作者:潘小小 知识蒸馏是一种模型压缩方法,是一种基于“教师-学生网络思想”的训练方法,由于其简单&#xf…

深度学习三大谜团:集成、知识蒸馏和自蒸馏

深度学习三大谜团:集成、知识蒸馏和自蒸馏 转自:https://mp.weixin.qq.com/s/DdgjJ-j6jHHleGtq8DlNSA 原文(英):https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge…

在墙上找垂直线_墙上如何快速找水平线

在装修房子的时候,墙面的面积一般都很大,所以在施工的时候要找准水平线很重要,那么一般施工人员是如何在墙上快速找水平线的呢?今天小编就来告诉大家几种找水平线的方法。一、如何快速找水平线1、用一根透明的软管,长度…

Vision Transformer(ViT)PyTorch代码全解析(附图解)

Vision Transformer(ViT)PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单。本文将根据最原始的Vision Transformer论文,及其PyTorch实现,将整个ViT的代码做一…

Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

Linux下的ELF文件、链接、加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程,这个文件可以被加载到内存并执行。链接可以执行与编译时,也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是被加载器加…

java 按钮 监听_Button的四种监听方式

Button按钮设置点击的四种监听方式注:加粗放大的都是改变的代码1.使用匿名内部类的形式进行设置使用匿名内部类的形式,直接将需要设置的onClickListener接口对象初始化,内部的onClick方法会在按钮被点击的时候执行第一个活动的java代码&#…

linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

本文转载自美团技术团队发表的同名文章https://tech.meituan.com/linux-jvm-memory.html一, linux与进程内存模型要理解jvm最重要的一点是要知道jvm只是linux的一个进程,把jvm的视野放大,就能很好的理解JVM细分的一些概念下图给出了硬件系统进程三个层面内存之间的关系.从硬件上…

java function void_Java8中你可能不知道的一些地方之函数式接口实战

什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 java8…

java jvm内存地址_JVM--Java内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如图:1.程序计数器可以看作是当前线程所执行的字节码的行号指示器,通俗的讲就是用来指示执行哪条指令的。为了线程切换后能恢复到正确的执行位置Java多线程是…

java情人节_情人节写给女朋友Java Swing代码程序

马上又要到情人节了,再不解风情的人也得向女友表示表示。作为一个程序员,示爱的时候自然也要用我们自己的方式。这里给大家上传一段我在今年情人节的时候写给女朋友的一段简单的Java Swing代码,主要定义了一个对话框,让女友选择是…

java web filter链_filter过滤链:Filter链是如何构建的?

在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。Filter链用FilterChain对象来表示,FilterChain对象中…

java final static_Java基础之final、static关键字

一、前言关于这两个关键字,应该是在开发工作中比较常见的,使用频率上来说也比较高。接口中、常量、静态方法等等。但是,使用频繁却不代表一定是能够清晰明白的了解,能说出个子丑演卯来。下面,对这两个关键字的常见用法…

java语言错误的是解释运行的_Java基础知识测试__A卷_答案

考试宣言:同学们, 考试考多少分不是我们的目的! 排在班级多少的名次也不是我们的初衷!我的考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目你不会做,又或者做错了, 那么不用怕, 考完试后, 导师讲解的时候你要注意听…