程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 減少mysql存儲列的方法(以設計網絡店鋪為例)

減少mysql存儲列的方法(以設計網絡店鋪為例)

編輯:MySQL綜合教程


在設計數據庫時,我們會經常碰到表示是非的字段,網絡漁夫-汪維曾在設計店鋪表時就遇到下列情況:


該店鋪有如下屬性:首先是否具有如圖所示的消費者保障服務:
其次還有諸如是否屬於中關村商圈等等;在這裡如果要表示上述的幾種屬性,按照常規做法我得設計7個字段;如果以後又增加了個如平台保的服務,我又得增加個字段,所以這樣做的缺點之一是不便於擴展;第二是占用的列太多,列太多會影響查找數據時的速度;

第三就是這些字段由於是表示是非的值,所以做索引純屬浪費。 介於以上缺點,我拋棄了上述方法;在這裡我只要一個字段就可以表示上述所有的屬性。
做法如下: 1.設計一個名為protect_str的字段,類型為binary(12);其值默認為000000000000;這裡設計為12位是為了以後擴展需要  www.2cto.com   這裡我用從左到右的六位依次來表示6種消保,如000000000011表示如實描述和快速發貨; 為0的位置表示沒有這個屬性,如000000000001表示這家店沒有快速發貨這個屬性;反之則表示有;第7位表示是否屬於中關村商圈子。 2.查詢: 現在要查詢所有擁有如實描述屬性的店鋪,sql語句如下: SELECT * FROM `shops1` WHERE ( protect_str &000000000001 ) =1   查詢既擁有如實描述又擁有快速發貨屬性的店鋪,sql語句如下: SELECT * FROM `shops1` WHERE ( `protect_str` &000000000011 ) =11   但是當執行SELECT 100101 &100001 時結果卻變成99841(至於為什麼是這個結果,網絡漁夫還沒想清楚,如果有知道者請留言給我) 所以用這種方式來記錄也行不通。 所以換成將二進制用十進制來進行存儲。比如當二進制的第一位為1(即為0000001)時表示如實描述,轉化為十進制則為1 當二進制的第一位為1,第二位也為1(即為0000011)時表示如實描述,和快速發貨,轉化為十進制存儲在數據庫中則為3;至於為什麼為3(1*2的0次方+1*2的1次方);當二進制的第一位為1,第二位也為1,第三位也為1(即為0000111)時表示如實描述,和快速發貨,七天退換,轉化為十進制存儲在數據庫中則為7; 當一個店鋪既有如實描述,和快速發貨,七天退換保障又屬於中關村商圈時,則可用1000111來表示,轉換成十進制存儲在數據庫中則為71  www.2cto.com  
現在要查詢所有擁有如實描述屬性的店鋪,sql語句如下: SELECT * FROM `shops1` WHERE ( protect_str &1 ) =1 現在要查詢所有擁有快速發貨屬性的店鋪,sql語句如下:   SELECT * FROM `shops1` WHERE ( protect_str &2 ) =2 現在要查詢所有屬於中關村在線商圈的店鋪,sql語句如下:   SELECT * FROM `shops1` WHERE ( `protect_str` &64 ) =64 LIMIT 0 , 30 查詢所有既屬於中關村在線商圈又有如實描述服務保障的店鋪,sql語句如下: SELECT * FROM `shops1` WHERE ( `protect_str` &65 ) =65 LIMIT 0 , 30
如若以後有擴展則接著往高位上補數字就行了,比如說現在在對id=5的店鋪增加了一個平台保障服務 則這時可對有此項服務的店鋪protect_str 字段的第八位值設為1即10000000轉化為十進制即為128(1*2的7次方) 執行如下語句:   UPDATE `test`.`shops1` SET `protect_str` = ( `protect_str` |128 ) WHERE `shops1`.`id` =5   即可將此字段值改為135; 綜上所述,凡是我們要加上某項服務的地方,我們用”|”或運算;凡是要查詢具有某項服務的地方我們用”&”與運算。 掌握了二進制轉十進制,還有查詢和更新,減少mysql存儲列將不再是問題。 下面給出試驗用的數據庫,大家可以用上述語句測試一下   CREATE TABLE `shops1` ( `id` int(10) unsigned NOT NULL auto_increment, `shop_name` char(50) collate utf8_unicode_ci NOT NULL, `protect_str` int(12) NOT NULL default '0', `shop_id` int(11) unsigned NOT NULL, PRIMARY KEY (`id`)  www.2cto.com   ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='店鋪表' AUTO_INCREMENT=8 ; -- -- 導出表中的數據 `shops1` -- INSERT INTO `shops1` VALUES (1, 'bestshop', 1, 13); INSERT INTO `shops1` VALUES (3, 'firstshop', 2, 15); INSERT INTO `shops1` VALUES (4, 'nihao', 71, 23); INSERT INTO `shops1` VALUES (5, 'shis', 135, 34); INSERT INTO `shops1` VALUES (6, 'ytshop', 6, 45); INSERT INTO `shops1` VALUES (7, 'uushop', 65, 65);       作者 sss0213

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved