當我們在設計數據庫的數據表時,經常會遇到一對多的數據結構,如新聞的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