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


         

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章