1. 程式人生 > >[資料庫]關於設計表時應該注意的問題

[資料庫]關於設計表時應該注意的問題

如有錯誤歡迎大家指出。這段時間在家裡,做了點修正。 1、慎重選擇表名。 有兩種選擇: 按照多數開發語言的命名規則。比如(myCustomer)。 按照多數開源思想命名規則。比如(my_customer)。 按照咱們中國人的思想。比如(我的客戶)。 第一種有個缺點,很容易忘掉大寫的字母。 第二種則比較好,每個WORD間用下劃線連線,避免遺忘。 第三種建議不要用,雖然很好記。不覺得解析這個表的時候還需要編碼轉化嗎?我個人理解,大家可以補充。 2.  關於編碼的設定。 A.             GBK/GB2312.(適用於純中文儲存)。 B.           UTF8.(適用於中英文混合儲存)。 C.            LATIN1。(適用於純英文儲存)。 D.     其他的。 3. 
關於表引擎的選擇。
A.                 MYISAM.(很多人說她的表級鎖定會帶來好多問題,其實只要設計好對應的表以及寫好對應的SQL查詢就沒有那麼大的問題。) B.                  INNODB. (如果要用到事務,選擇她不會錯。至於多數人講的MASTER/SLAVE結構上用INNODB在MASTER的選擇是否正確,就要看你怎麼用了。不能一味的瘋狂使用INNODB。除非你想要確保非常高可用性, ) C.                  CSV. (以前我寫過文章,關於這個引擎。個人覺得最主要的是來儲存少量資料以及從EXCEL到MYSQL的轉換方面會很有用。當然只要涉及到規則資料的匯入,她就可以辦到。) D.                  BLACKHOLE. (覺得最完美的用處在於MASETR/SLAVE上面,並且MASTER是一個臨時的專門負責寫的機器。不過缺點也很多,會與MYISAM或者INNODB或者其他的引擎有所衝突,這點自己要做個權衡)。 E.                   MEMORY. (應該說是MYISAM的兄弟了。不過在讀記憶體總比讀磁碟的速度要快。不過要注意,它不支援動態資料型別)。 F.                   FEDERATED. (典型的分散式引擎。我以前文章中有介紹。) G.    NDB。(網路版儲存引擎。因為Replication 總是有延遲,所以如果系統容不得任何延遲,就用這個吧。)
   H.    FOLCON。(6.0後用來代替INNODB的引擎。)
4. 
關於屬性資料型別的選擇。
A.                  INT(一個位元組的TINYINT,兩個位元組的SMALLINT,三個位元組的MEDIUMINT,四個位元組的INT,8個位元組的BIGINT。記住:UNSIGNED不管你定義或者不定義,都不影響內部的儲存位元組大小) B.                   少於10個字元用CHAR是在合適不過了。(不過要記住在MEMORY引擎裡面會自動把VARCHAR轉化為CHAR) C.                   我一般用DECIMAL或者NUMERIC來代替FLOAT 或者DOUBLE。因為老闆要求精確的數字。如果不要求精確的,那就用FLOAT吧。速度快,佔空間小。(DECIMA、FLOAT(P)是動態儲存。比如 :D
 ECIMAL(10,2)佔用5個位元組。FLOAT佔4個位元組,) D.                 BLOB,TEXT,VARCHAR(一般存放文章內容,特別是新聞網站。需要的位元組數是所儲存的字元長度+1。記住BLOB和VARCHAR是TEXT和CHAR的BINARY型別) E.                   ENUM(在一定範圍內絕佳的代替VARCHAR和CHAR的工具,因為她只佔一到兩個位元組。) F.                   時間和日期型別(佔3個位元組的DATE,8個位元組的DATETIME,4個位元組的TIMESTAMP,3個位元組的TIME,1個位元組的YEAR。)。如果要儲存比如‘1983’這樣的年份,用YEAR明顯比VARCHAR或者CHAR要節省空間。因為後者要佔5個位元組。 G.                  BOOLEAN(用來儲存YES或者NO之類的值,佔用一個位元組。) H.                  關於自增欄位。目前我們的專案中涉及到好多ORDER BY RAND()操作。此類語句在資料庫併發大的時候會造成CPU嚴重阻塞,持續產生資料庫死鎖!解決此類問題最好的辦法就是利用自增欄位,用程式隨即生成數字序列,或者在資料庫端隨即生成數字序列。 I.                    關於ZEROFILL。非常好用的前置填補0的儲存,而不是用用對應個數的空串來代替。在需要前置補零的操作中INT ZEROFILL可以用來代替CHAR或者VARCHR。 5.  關於預設值。 A.                  在5.0之後,只要設定欄位為NOT NULL,系統自動給出預設值。對應CHAR->’’,INT->0,BOOLEAN->0等等。 B.                   在5.0之前的版本,需要手動指定預設值,否則會出現一定的異常。到時候查都不好查了。 6.  關於多資料庫建立。 A.                  應該把對應的業務放在各自不同的資料庫裡,而不是所有業務放到一個庫裡面。 B.                   資料庫的命名和表命名一樣。 7.  關於索引。 A.                  設計表初期儘量考慮到應該建立的索引。所有建立的索引一定要測試一下,看是否有必要,否則會翻倍的減少寫資料的效能。 B.                   對於只有儲存0或者1的列,儘量幹掉索引,單獨分出兩個表。一個代替0,另外一個代替1。或者在一個欄位裡面用EMUM或者CHAR(0)或者CHAR(1)來代替。    PS: 最後一個要值得注意的,就是儘量所有的欄位用NOT NULL。雖然MYSQL可以對NULL列進行索引,不過我不建議。

相關推薦

[資料庫]關於設計應該注意的問題

如有錯誤歡迎大家指出。這段時間在家裡,做了點修正。 1、慎重選擇表名。 有兩種選擇: 按照多數開發語言的命名規則。比如(myCustomer)。 按照多數開源思想命名規則。比如(my_customer)。 按照咱們中國人的思想。比如(我的客戶)。 第一種有個缺點,很容易忘掉

設計快取系統應該注意的幾點問題

前言設計一個快取系統,不得不要考慮的問題就是:快取穿透、快取擊穿與失效時的雪崩效應。快取穿透快取穿透是指查詢一個一定不存在的資料,由於快取是不命中時被動寫的,並且出於容錯考慮,如果從儲存層查不到資料則不寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的

mysql設計註意事項

tls ase rem 前綴 默認 upd cnblogs 允許 字符類 說明:本文是對項目過程中的一些要求的簡單匯總整理,主要是供個人本身參考。。。 一、表設計 1、 在創建表結構時,表名、字段需要見名知意,不采用拼音 create table `tb_abc` (

mysql資料庫,使用mybatis動態設定

mybatis中傳遞引數一般使用#{},但是當引數是表名時#{}就會報錯。這是為啥呢? 這是因為#{ } 解析為一個 JDBC 預編譯語句(prepared statement)的引數標記符。 簡單來講:select * from user_#{tableVersion} 會被解析為

Python在pycharm中程式設計應該注意的問題彙總

1、縮排問題   在 pycharm 中點選 enter 自動進行了換行縮排,此時應該注意:比如 if   else  語句,後面跟著列印輸出 print 的時候,一定注意是要if語句下的輸出還是else語句下的輸出,還是 if  else 語句執行結束輸出,prin

讓天下沒有難用的資料庫 » 遷移到RDS應該注意的問題

相信大部分使用者在將自己本地的資料庫遷移到RDS的時候都會遇到各種各樣的問題,這裡總結一下在遷移過程中常見的問題,包括將本地資料庫(客戶資料庫)匯出成可執行的SQL檔案—–>匯入到遠端的RDS資料庫—->測試驗證. 案例一:使用者遷移到RDS,遇到檢視依賴的問題(MSSQL資料庫) 使用

PHP購物網站(含購物車、全部原始碼、資料庫設計及其原始碼)

這是我在研究生期間,老師要求做的一個類似原始淘寶網的購物網站, 因為不會PHP,為了寫這個作業而新學的。 做這個網站用了兩週時間,在此把這個小專案做一個總結。 這個小專案做的時間非常趕,一共兩週,實際有效時間只有10天,中間還在忙其他的事。所以有很多不足之

企業在做搜尋引擎優化應該注意什麼?

這是一個網際網路的時代,每個企業都擁有自己的官方網站,以搜尋營銷為主的企業,通常在SEO優化中,都會投入大量的資源去獲取搜尋流量。 對於一些初創企業,剛剛進入SEO行業的時候,經常會遭遇到各種問題,有的是善意的,有的則是令人遺憾的。 它嚴重影響SEO專案的程序,以及企業對

C++中Vector(向量)使用erase應該注意的事項

在使用Vector中,如果使用erase不小心,很容易陷入無限迴圈.如下: //向陣列中新增一個元素 MyArray.push_back(8); vector<unsigned short>::iterator it = MyArray.begin()

navicat中設計,索引,外來鍵,觸發器的建立和作用

navicat 為表新增索引 分析常用的查詢場景,為欄位新增索引,增加查詢速度。 可以新增單列索引,可以新增聯合索引。 右鍵,設計表中可以檢視和新增修改索引! 索引一定要根據常用的查詢場景進行新增! 寫了sql語句測試了一下,確實使用了索引! 可以通過

資料庫設計(之間的3種關係)

表與表之間一般存在三種關係,即一對一,一對多,多對多關係。 下面分別就三種關係講解資料庫相關設計的思路和思考過程; (1)一對一關係 例如,下面的一張表,儲存了人的相關資訊,有男有女,要求查處所有的夫妻。 sql程式碼: CREATE TABLE

mysql建立資料庫設定字符集

建立資料庫及表時設定字符集,避免出現中文亂碼的方法: 建立資料庫 CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci; --注意後面三個單詞之間是有下劃線的對於每個選項所給定的值,前面沒有等

用 Python 寫爬蟲應該注意哪些坑

1. 新增user-agent,header。避免一開始就被遮蔽掉。推薦用urllib2,requests(最近才用這個,發現很好用) 2. 編碼用utf-8,本地儲存的時候用codes.open 來儲存中文字元 3. lxml解析的速度要比beautifulsoup快的多 4. 如果beautiful和l

指標做形參應該注意的地方

1. 指標作為形參時,不可以將指標的地址改變,比如呼叫malloc。 2. 只可以對指標指向的值做改變。 首先看以下程式: #include <stdio.h> int *swap(int *px, int *py){     int tem

MySQL DROP TABLE操作以及 DROP 大注意事項

語法: 刪表 DROP TABLE Syntax DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] 可一次刪除一張或多張表。需具有所刪除表上的D

C++中設計注意事項與遵循原則

      首先要說的是預設建構函式,編譯器可以幫使用者定義一個預設建構函式,前提是使用者沒有定義任何建構函式,一旦使用者定義了某個建構函式,不管它是不是預設的,那麼編譯器都不會再幫使用者定義預設構造函數了,在使用者定義自己的預設建構函式時,要麼沒有引數,要麼所有的引數都有一

js中空字串和數值0作邏輯對比應該注意的問題。

例子如下: var val = 0;var t1 = (val != '');var t2 = (val != 0);var t3 = (val == '');var t6 = (val == 0);

使用create table ...as建立注意的問題

工作中有時候做hive開發了,需要對一張表進行備份。一般都會使用 create table as  ...簡單方便,但是需要注意as建表產生的問題,因為as建表並不會儲存原表樣式。 create ta

Hibernate在配置 one-to-many應該注意的事項

其實配置one-to-many的對映很簡單,就是在one所代表的這個類中新增一個集合物件,一般用set,來儲存對應的many所代表的那個類的物件,比如,一個person對應多個order,(一個人對應多個訂單),那麼在person類中新增private Set<Ord

寫程式碼應該注意的問題

1, 程式碼可維護性相關  (1), svn 提交不寫註釋  (2), 命名太隨意  (3), 程式碼隨意排版  (4), 多層巢狀結構  (5), 一個方法包打天下 : 要記住 -- 單一職責原則, 一個方法不應該承載太多,要儘量抽取出來。  (6), 不統一的風格  (