Code Bye

mysql的数据库设计问题

讨教一个数据库设计的问题,本人现在设计的一个高新科技成果的表,存储一些高新科技的信息,其中有一个产业领域的字段,这个字段的可选项一共有7个,并且可以是多选的,如图所示。

此外这个字段在查询中会经常被作为查询条件用到,问一下本人是不是一定要建立一个字典表存储这7种类型,然后建立一个关系表存储每一个高新科技记录对应的产业领域?有没有更好的解决方案?
解决方案

5

LZ你好,
本人之前做的一个项目有相似的过程,大致如下

OTA酒店预定网站的数据库中,例如酒店所包含的服务:1,2,3,4,5…..
有些酒店可能只包含一个,有些则包含多个,
建表时则是将全部的服务见一个服务表,
然后在酒店的表中有一个服务字段,包含全部这个酒店包含的服务,字段格式为1#2#3……#作为分隔符
需要用时,以# 将这个字段分隔开,单独取出
这样设计对于检索和存储都有很高的效率

5

两种设计:
1:就一一对应,例如一个科技成果有多个产业领域,那就设计为有几个产业领域就有几行.
2:就用一对多.例如一个科技成果有多个产业领域,那就设计为有几个产业领域就将几个产业领域设计为一行,用逗号隔开.
然后另一张表就设计为一个产业领域有多个科技成果也为一行,就不需要什么关系表了.
看数据,假如多的话,推荐第二种,原因是mysql有一个find_in_set函数,能够很好的解决问题。

10

有一种办法可以只用一个字段存储产业领域,数据类型可以用短整型,而不用额外建立关系表。
将产业领域表示成二进制,二进制的每一位对应七种类型,假如是该类型的,就将该位置成1,否则置0
假设预留一个字段用以扩展(也可以预留多个字段,根据实际情况调整)
二进制的位	7	 6          5     	4	          3	         2	    1            0
对应领域	预留	其他	现代农业	新材料	生物技术与医药	能源环保	装备制造	电子信息

存储
例如:假设一个产业同时属于现代农业和电子信息,则对应的二进制位 00100001,转成十进制为33,则产业领域字段存储33。
其他的依次类推
查询,使用按位与
假设要筛选同时属于现代农业和电子信息领域的:

select * from 高科技信息表 where bin(产业领域字段值) & 00100001 = 33:

假设要筛选属于其他领域的:

select * from 高科技信息表 where bin(产业领域字段值) & 01000000 = 64:

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql的数据库设计问题