日期:2014-05-18  浏览次数:20583 次

这样的系统如何设计表
请各位帮我看下这设计:
现在有一个条码系统,
序列号表--记录打印的批次和该批次所有的序列号:
如:
print_id sn 表中id就是打印序列号的批次,
-- -- sn就是打印批次对应的序列号,同一个批次中序列号是相连的
a1 A45648797  
a1 A45648798
b2 A45647810
b2 A45647811
b2 A45647812
生产信息表--记录产品的生产信息 ,如生产批次,规格等等。最主要的是序列号字段,条码打印批次序号,与该批次的生产数量
如:
logid start_sn num print_id
--- ------ --- --------- 表中logid代表生产批次编号,
sc0001 A45648797 2 a1 start_sn该生产批次中最开始的序列号,num代表该生产批次的产品数量
sc0002 A45647810 2 b2 a1对应条码打印批次(通过他与序列号表连接,可以得到每个产品得序列号与生产信息)
销售信息表--记录产品销售信息,如客户,销售日期等等。最主要的是序列号字段。
如:
xsid sn kh 表中sn就是销售产品得条码。
-- --- ---
xs001 A45647811 上海XXX
xs0002 A45648798 北京XXX
现在我的设计就是如上的,三个表主要是通过sn来连接的。
SQL code
序列号表 c INNER JOIN
              生产信息表 d ON d .printid= c.printid  FULL JOIN
              销售信息表 a ON a.sn = c.sn


现在序列号表数据量很大,每次查询的时候都要连接到该表来查询。

现在有个想法,就是不要序列号表,可以通过生产信息表来直接得到所有序列号信息
原理:生产信息表中的start_sn与num推算出该生产批次中最后的序列号,并插入该该列end_sn
然后只要关联生产信息表与销售信息表
SQL code
生产信息表.start_sn<=销售信息表.sn<=生产信息表.end_sn

请问这个改进合不合理。
如果合理该怎么操作。
(varchar的比较大小是怎么样的如A1797897--B189787的序列号,是不是先按最开始的字母来排大小,再按后面的数字大小来排序的),
如果我要保留支持序列号的模糊查询的功能该如何实现。
谢谢

------解决方案--------------------
生产信息表.start_sn<=销售信息表.sn<=生产信息表.end_sn

你这个是字符串比较大小,如果位数都相同,可以考虑尝试,不过即使这样做我还是建议对SN加上索引.
------解决方案--------------------
个人觉得:你是对产品进行管理,或许你是做条码,但不要只注意条码
=======================================================
表一:产品表[产品编号,生产批次]
表二:打印信息表[产品编号,条码编号,产品信息...]
表三:销售信息表[产品编号,销售编号,客户信息...]

对产品,你可以考虑用条码做产品编号,不过也可以用数值编号


=========================================================
sn就是打印批次对应的序列号,同一个批次中序列号是相连的,这个规则不一定是永远的,你觉得呢?