mysql如何让设计数据量较少的一对多关系数据表

       当我们在设计数据库的数据表时,经常会遇到一对多的数据结构,如新闻的tag等,比如我们在设计数据表的时候,就碰到了这个问题,

       当时涉及楼盘数据表(house)物业性质、楼盘的装修性质等情况的时候,因为一个楼盘可能会涉及多个物业性质,而且物业性质的数量并不是很多。为了便于搜索,如果把所有物业性质的ID用分隔符组合成一个字符串肯定不符合要求。所以一般都是单独使用一个表来存储他们的对应关系,每次修改的时候,还必须先清除所有的对应数据,然后重新插入,非常麻烦,为了保证数据的一致性,还必须用事务。很显然,对于关联数据种类很少的情况下,这两种方法都不好。

       在linux里,读写运行权限用421来表示,这就是一个典型的一对多的场景,比如用7就可以表示同时拥有3种权限,7表示读写权限。

     

//住宅物业类型,数据存储的是值
$dict['house']['hometype'] = array(
    1 => "普通住宅",
    2 => "公寓",
    3 => "别墅",
    4 => "写字楼",
    5 => "经济适用房",
    6 => "Townhouse",
    7 => "酒店式公寓",
    8 => "商铺",
    9 => "商住",
    10 => "建筑综合体",
    11 => "两限房",
    12 => "自住型商品房"
);

      如果一个楼盘存在多个物业类型,那么,假如一个楼盘属于普通住宅和别墅,则加起来数字为2^1+2^3 =10 .如果属于普通住宅,别墅,商铺,则为2^1+2^3+2^8=258 .

      我们如果要查询普通住宅,则可以:

    

 SELECT site,hid,name,hometype FROM `house` WHERE `hometype` & 2 = 2

      如果我们要查既属于普通住宅,又属于别墅,则sql语句为

 SELECT site,hid,name,hometype FROM `house` WHERE `hometype` & 10 = 10

    

     假如我们要给第3条记录添加经济适用房,则sql语句为

 

  UPDATE `house` SET `hometype` = `hometype` | 32 WHERE `site` = 'bj' and hid = 3
   

     假如我们要给第3条记录删除普通住宅,则sql语句为

    

  UPDATE `house` SET `hometype` = `hometype` ^ 2 WHERE `site` = 'bj' and hid = 3


         

   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值