1. 程式人生 > >Python與數據庫[0] -> 數據庫概述

Python與數據庫[0] -> 數據庫概述

dep nis text nes 行鎖 transacti 成熟 產品 控制

數據庫概述 / Database Overview


1 關於SQL / About SQL

構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫系統;同時也是數據庫腳本文件的擴展名。

結構化查詢語言是高級的非過程化編程語言,允許用戶在高層數據結構上工作。它不要求用戶指定對數據的存放方法,也不需要用戶了解具體的數據存放方式,所以具有完全不同底層結構的不同數據庫系統, 可以使用相同的結構化查詢語言作為數據輸入與管理的接口。結構化查詢語言語句可以嵌套,這使它具有極大的靈活性和強大的功能。

1.1 SQL語言 / SQL Language

結構化查詢語言包含6個部分:

1. 數據查詢語言(DQL: Data Query Language

其語句,也稱為“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECTDQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。

2. 數據操作語言(DML: Data Manipulation Language

其語句包括動詞INSERT, UPDATEDELETE。它們分別用於添加,修改和刪除表中的行。也稱為動作查詢語言。

3. 事務處理語言(TPL

它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。

4. 數據控制語言(DCL

它的語句通過GRANTREVOKE獲得許可,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對表單個列的訪問。

5. 數據定義語言(DDL

其語句包括動詞CREATEDROP。在數據庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);為表加入索引等。DDL包括許多與人數據庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。

6. 指針控制語言(CCL

它的語句,像DECLARE CURSOR, FETCH INTOUPDATE WHERE CURRENT用於對一個或多個表單獨行的操作

1.2 SQL數據類型 / SQL Data

結構化查詢語言共有五種數據類型,字符型文本型數值型邏輯型日期型

1. 字符型

VARCHAR VS CHAR

VARCHAR型和CHAR型數據的這個差別是細微的,但是非常重要。他們都是用來儲存字符串長度小於255的字符。

假如你向一個長度為四十個字符的VARCHAR型字段中輸入數據Bill Gates。當你以後從這個字段中取出此數據時,你取出的數據其長度為十個字符——字符串Bill Gates的長度。假如你把字符串輸入一個長度為四十個字符的CHAR型字段中,那麽當你取出數據時,所取出的數據長度將是四十個字符。字符串的後面會被附加多余的空格

當你建立自己的站點時,你會發現使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段時,你不需要為剪掉你數據中多余的空格而操心。

VARCHAR型字段的另一個突出的好處是它可以比CHAR型字段占用更少的內存和硬盤空間。當你的數據庫很大時,這種內存和磁盤空間的節省會變得非常重要。

2. 文本型 TEXT

使用文本型數據,你可以存放超過二十億個字符的字符串。當你需要存儲大串的字符時,應該使用文本型數據。

註意文本型數據沒有長度,而上一節中所講的字符型數據是有長度的。一個文本型字段中的數據通常要麽為空,要麽很大。

當你從HTML FORM的多行文本編輯框(TEXTAREA)中收集數據時,你應該把收集的信息存儲於文本型字段中。但是,無論何時,只要你能避免使用文本型字段,你就應該不使用它。文本型字段既大且慢,濫用文本型字段會使服務器速度變慢。文本型字段還會吃掉大量的磁盤空間

一旦你向文本型字段中輸入了任何數據(甚至是空值),就會有2K的空間被自動分配給該數據。除非刪除該記錄,否則你無法收回這部分存儲空間。

3. 數值型 整數INT 小數NUMERIC 錢數MONEY

INT VS SMALLINT VS TINYINT

通常,為了節省空間,應該盡可能的使用最小的整型數據。一個TINYINT型數據只占用一個字節;一個INT型數據占用四個字節。這看起來似乎差別不大,但是在比較大的表中,字節數的增長是很快的。另一方面,一旦你已經創建了一個字段,要修改它是很困難的。因此,為安全起見,你應該預測一下,一個字段所需要存儲的數值最大有可能是多大,然後選擇適當的數據類型。

NUMERIC

為了能對字段所存放的數據有更多的控制,你可以使用NUMERIC型數據來同時表示一個數的整數部分和小數部分。NUMERIC型數據使你能表示非常大的數——比INT型數據要大得多。一個NUMERIC型字段可以存儲從-10^3810^38範圍內的數。NUMERIC型數據還使你能表示有小數部分的數。例如,你可以在NUMERIC型字段中存儲小數3.14。

MONEY VS SMALLMONEY

你可以使用 INT型或NUMERIC型數據來存儲錢數。但是,專門有另外兩種數據類型用於此目的。

如果你希望你的網點能掙很多錢,你可以使用MONEY型數據。如果你的野心不大,你可以使用SMALLMONEY型數據。MONEY型數據可以存儲從-922,337,203,685,477.5808922,337,203,685,477.5807的錢數。如果你需要存儲比這還大的金額,你可以使用NUMERIC數據。

SMALLMONEY型數據只能存儲從-214,748.3648214,748.3647 的錢數。同樣,如果可以的話,你應該用SMALLMONEY型來代替MONEY型數據,以節省空間

4. 邏輯型 BIT

如果你使用復選框(CHECKBOX)從網頁中搜集信息,你可以把此信息存儲在BIT型字段中。BIT型字段只能取兩個值:01

Note: 在你創建好一個表之後,不能向表中添加 BIT型字段。如果你打算在一個表中包含BIT型字段,你必須在創建表時完成

5. 日期型

DATETIME VS SMALLDATETIME

一個 DATETIME型的字段可以存儲的日期範圍是從175311日第一毫秒到99991231日最後一毫秒

如果你不需要覆蓋這麽大範圍的日期和時間,你可以使用SMALLDATETIME型數據。它與DATETIME型數據同樣使用,只不過它能表示的日期和時間範圍比DATETIME型數據小,而且不如DATETIME型數據精確。一個SMALLDATETIME型的字段能夠存儲從190011日到207966日的日期,它只能精確到

DATETIME型字段在你輸入日期和時間之前不包含實際的數據,認識這一點是重要的

1.3 SQL常用命令 / SQL Frequent Command

可參考常用命令。

1.4 T-SQL簡介 / About Transact-SQL

Transact-SQL(T-SQL)是微軟和Sybase使用的一種SQL擴展語言,用於與關系型數據庫進行事務交互。T-SQL擴展了SQL的多項標準,包括過程編程,本地變量及多種支持函數,同時也對DELETE和UPDATE語句進行了修改,允許DELETE與UPDATE增加條件FROM。

在流程控制方面,加入了BEGIN和END,BREAK,CONTINUE,GOTO以及IF和ELSE,RETURN,WAITFOR和WHILE等,使其更具編程化。

2 關於數據庫 / About Database

2.1 常用數據庫

目前主要的幾種流行數據庫為MySQL, SQL server, Oracle, Sysbase, Access等,詳細內容可以參考常用數據庫。

2.1.1 MySQL

2.1.1.1 MySQL簡介

MySQL是最受歡迎的開源SQL數據庫管理系統,它由MySQL AB開發、發布和支持。MySQL AB是一家基於MySQL開發人員的商業公司

MySQL是一個快速的、多線程、多用戶和健壯的SQL數據庫服務器。MySQL服務器支持關鍵任務、重負載生產系統的使用,也可以將它嵌入到一個大配置(mass- deployed)的軟件中去。

  與其他數據庫管理系統相比,MySQL具有以下優勢:

  (1) MySQL是一個關系數據庫管理系統。

  (2) MySQL是開源的。

  (3) MySQL服務器是一個快速的、可靠的和易於使用的數據庫服務器。

  (4) MySQL服務器工作在客戶/服務器嵌入系統中。

  (5) 有大量的MySQL軟件可以使用

2.1.1.2 MySQL使用教程

關於MySQL數據庫的使用可以參考教程。

2.1.1.3 MySQL數據類型

可以參考MySQL的數據類型。

2.1.1.3.1 整型

MySQL數據類型

含義(有符號)

tinyint(m)

1個字節 範圍(-128~127)

smallint(m)

2個字節 範圍(-32768~32767)

mediumint(m)

3個字節 範圍(-8388608~8388607)

int(m)

4個字節 範圍(-2147483648~2147483647)

bigint(m)

8個字節 範圍(+-9.22*10的18次方)

Note: 取值範圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值範圍為(0~256)。 int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,沒有影響到顯示的寬度,不知道這個m有什麽用。

2.1.1.3.2 浮點型(floatdouble)

MySQL數據類型

含義

float(m,d)

單精度浮點型,8位精度(4字節),m總個數,d小數位

double(m,d)

雙精度浮點型,16位精度(8字節),m總個數,d小數位

Note: 設一個字段定義為float(5,3),如果插入一個數123.45678,實際數據庫裏存的是123.457,但總個數還以實際為準,即6位。

2.1.1.3.3 定點數

浮點型在數據庫中存放的是近似值,而定點類型在數據庫中存放的是精確值。
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位。

2.1.1.3.4 字符串(char, varchar, _text)

MySQL數據類型

含義

char(n)

固定長度,最多255個字符

varchar(n)

固定長度,最多65535個字符

tinytext

可變長度,最多255個字符

text

可變長度,最多65535個字符

mediumtext

可變長度,最多2的24次方-1個字符

longtext

可變長度,最多2的32次方-1個字符

charvarchar

1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。所以char類型存儲的字符串末尾不能有空格,varchar不限於此。

2.char(n) 固定長度,char(4)不管是存入幾個字符,都將占用4個字節,varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),所以varchar(4),存入3個字符將占用4個字節。

3.char類型的字符串檢索速度要比varchar類型的快。

varchartext

1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<=255)或2個字節(n>255),text是實際字符數+2個字節。

2.text類型不能有默認值。

3.varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速度快於text,在都創建索引的情況下,text的索引似乎不起作用。

2.1.1.3.5 二進制數據(_Blob)

1._BLOB和_text存儲方式不同,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫。

2._BLOB存儲的數據只能整體讀出。

3._TEXT可以指定字符集,_BLO不用指定字符集。

2.1.1.3.6 日期時間類型

MySQL數據類型

含義

date

日期 ‘2008-12-2‘

time

時間 ‘12:25:36‘

datetime

日期時間 ‘2008-12-2 22:06:44‘

timestamp

自動存儲記錄修改時間

若定義一個字段為timestamp,這個字段裏的時間數據會隨其他字段修改的時候自動刷新,所以這個數據類型的字段可以存放這條記錄最後被修改的時間。

2.1.1.3.7 數據類型的屬性

MySQL關鍵字

含義

NULL

數據列可包含NULL值

NOT NULL

數據列不允許包含NULL值

DEFAULT

默認值

PRIMARY KEY

主鍵

AUTO_INCREMENT

自動遞增,適用於整數類型

UNSIGNED

無符號

CHARACTER SET name

指定一個字符集

2.1.1.4 MySQL自帶數據庫

2.1.1.4.1 information_schema

MySQL中,除了自行安裝的數據庫外,還有一個information_schema數據庫,詳細信息來源於參考鏈接。

information_schema數據庫是MySQL自帶的,它提供了訪問數據庫元數據的方式。什麽是元數據呢?元數據關於數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等。有些時候用於表述該信息的其他術語包括“數據詞典”和“系統目錄”。

在 MySQL中,把information_schema看作是一個數據庫,確切說是信息數據庫。其中保存著關於MySQL服務器所維護的所有其他數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型與訪問權限等。在information_schema中,有數個只讀表。它們實際上是視圖,而不是基本表,因此,你將無法看到與之相關的任何文件。

2.1.1.4.1.1 數據庫內的表說明

SCHEMATA表: 提供了當前mysql實例中所有數據庫的信息show databases的結果取之此表。

TABLES表: 提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪個schema,表類型,表引擎,創建時間等信息。show tables from schemaname的結果取之此表。

COLUMNS表: 提供了表中的列信息。詳細表述了某張表的所有列以及每個列的信息。show columns from schemaname.tablename的結果取之此表。

STATISTICS表: 提供了關於表索引的信息。show index from schemaname.tablename的結果取之此表。

USER_PRIVILEGES(用戶權限)表: 給出了關於全程權限的信息,該信息源自於mysql.user授權表。是非標準表

SCHEMA_PRIVILEGES(方案權限)表: 給出了關於方案(數據庫)權限的信息。該信息來自mysql.db授權表。是非標準表

TABLE_PRIVILEGES(表權限)表: 給出了關於表權限的信息。該信息源自mysql.tables_priv授權表。是非標準表

COLUMN_PRIVILEGES(列權限)表: 給出了關於列權限的信息。該信息源自mysql.columns_priv授權表。是非標準表

CHARACTER_SETS(字符集)表: 提供了mysql實例可用字符集的信息。show character set的結果集取之此表。

COLLATIONS表: 提供了關於各字符集的對照信息。

COLLATION_CHARACTER_SET_APPLICABILITY表: 指明了可用於校對的字符集。這些列等效於show collation的前兩個顯示字段。

TABLE_CONSTRAINTS表: 描述了存在約束的表。以及表的約束類型。

KEY_COLUMN_USAGE表: 描述了具有約束的鍵列。

ROUTINES表: 提供了關於存儲子程序(存儲程序和函數)的信息。此時,ROUTINES表不包含自定義函數(UDF)。名為“mysql.proc name”的列指明了對應於INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

VIEWS表: 給出了關於數據庫中的視圖的信息。需要有show views權限,否則無法查看視圖信息。

TRIGGERS表: 提供了關於觸發程序的信息。必須有super權限才能查看該表。

2.1.1.4.1.2 使用技巧

1. 類似MS SQL SERVER中的SP_HELPTEXT查看存儲過程、函數、視圖的功能

SHOW CREATE PROCEDURE 存儲過程名;

SHOW CREATE FUNCTION 函數名;

SHOW CREATE VIEW 視圖名;

還可以使用以下辦法(但下面的辦法只包含存儲過程主體部分,不包含Create以及傳入參數申明的部分):

SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=‘數據庫名‘ AND ROUTINE_TYPE=‘PROCEDURE‘ and ROUTINE_NAME=‘存儲過程名‘;

函數也類似,只需要將查詢條件對應改成ROUTINE_TYPE=‘FUNCTION‘就行

2. 查看當前實例包含的數據庫列表

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;

3. 查詢數據庫中所有的表(包含視圖

SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA=‘數據庫名‘ and TABLE_TYPE=‘BASE TABLE‘;

SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA=‘數據庫名‘ and TABLE_TYPE=‘VIEW‘;

4. 查詢數據庫中所有的視圖

SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=‘數據庫名‘;

5. 查詢表對應的字段

a. SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema=‘數據庫名‘ and table_name=‘表名‘;

b. 橫向列出表對應的字段,方便寫Insert語句: select GROUP_CONCAT(COLUMN_name) as ‘字段‘ from INFORMATION_SCHEMA.COLUMNS WHERE table_schema=‘數據庫名‘ and table_name=‘表名‘;

6. 查詢關鍵字在哪些存儲過程或者函數中存在

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=‘數據庫名‘ AND ROUTINE_TYPE=‘PROCEDURE‘ AND ROUTINE_DEFINITION like ‘%關鍵字%‘;

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=‘數據庫名‘ AND ROUTINE_TYPE=‘FUNCTION‘ AND ROUTINE_DEFINITION like ‘%關鍵字%‘;

2.1.2 SQL Server

2.1.2.1 SQL Server簡介

SQL Server (MSSQL)是由微軟開發的數據庫管理系統,是Web上最流行的用於存儲數據的數據庫,它已廣泛用於電子商務、銀行、保險、電力等與數據庫有關的行業。

目前最新版本是SQL Server 2005,它只能在Windows上運行,操作系統的系統穩定性對數據庫十分重要。並行實施和共存模型並不成熟,很難處理日益增多的用戶數和數據卷,伸縮性有限。

SQL Server 提供了眾多的Web和電子商務功能,如對XML和Internet標準的豐富支持,通過Web對數據進行輕松安全的訪問,具有強大的、靈活的、基於Web的和安全的應用程序管理等。而且,由於其易操作性及其友好的操作界面,深受廣大用戶的喜愛。

2.1.3 Oracle

提起數據庫,第一個想到的公司,一般都會是Oracle(甲骨文)。該公司成立於1977年,最初是一家專門開發數據庫的公司。Oracle在數據庫領域一直處於領先地位。 1984年,首先將關系數據庫轉到了桌面計算機上。然後,Oracle5率先推出了分布式數據庫、客戶/服務器結構等嶄新的概念。Oracle 6首創行鎖定模式以及對稱多處理計算機的支持,最新的Oracle 8主要增加了對象技術,成為關系—對象數據庫系統。目前,Oracle產品覆蓋了大、中、小型機等幾十種機型,Oracle數據庫成為世界上使用最廣泛的關系數據系統之一。

Oracle數據庫產品具有以下優良特性。

(1) 兼容性: Oracle產品采用標準SQL,並經過美國國家標準技術所(NIST)測試。與IBM SQL/DS、DB2、INGRES、IDMS/R等兼容。

(2) 可移植性: Oracle的產品可運行於很寬範圍的硬件與操作系統平臺上。可以安裝在70種以上不同的大、中、小型機上;可在VMS、DOS、UNIX、Windows等多種操作系統下工作。

(3) 可聯結性: Oracle能與多種通訊網絡相連,支持各種協議(TCP/IP、DECnet、LU6.2等)。

(4) 高生產率: Oracle產品提供了多種開發工具,能極大地方便用戶進行進一步的開發。

(5) 開放性: Oracle良好的兼容性、可移植性、可連接性和高生產率使Oracle RDBMS具有良好的開放性。

2.1.4 Sysbase

1984年,Mark B. Hiffman和Robert Epstern創建了Sybase公司,並在1987年推出了Sybase數據庫產品。Sybase主要有三種版本:一是UNIX操作系統下運行的版本;二是Novell Netware環境下運行的版本;三是Windows NT環境下運行的版本。對UNIX操作系統,目前應用最廣泛的是SYBASE 10及SYABSE 11 for SCO UNIX。

Sybase數據庫的特點:

(1) 它是基於客戶/服務器體系結構的數據庫。

(2) 它是真正開放的數據庫。

(3) 它是一種高性能的數據庫。

2.2 數據庫結構

2.2.1 數據庫 / Database

Visual Basic中使用的數據庫是關系型數據庫(Relational Database)。一個數據庫由一個或一組數據表組成。每個數據庫都以文件的形式存放在磁盤上,即對應於一個物理文件。不同的數據庫,與物理文件對應的方式也不一樣。對於dBASE, FoxPro和Paradox格式的數據庫來說,一個數據表就是一個單獨的數據庫文件,而對於Microsoft Access、Btrieve格式的數據庫來說,一個數據庫文件可以含有多個數據表。

2.2.2 數據表 / Table

簡稱表,由一組數據記錄組成,數據庫中的數據是以表為單位進行組織的。一個表是一組相關的按行排列的數據;每個表中都含有相同類型的信息。表實際上是一個二維表格,例如,一個班所有學生的考試成績,可以存放在一個表中,表中的每一行對應一個學生,這一行包括學生的學號,姓名及各門課程成績。

2.2.3 記錄 / Record

表中的每一行稱為一個記錄,它由若幹個字段組成。

2.2.4 字段 / Field

也稱域。表中的每一列稱為一個字段。每個字段都有相應的描述信息,如數據類型、數據寬度等。

2.2.5 索引 / Index

為了提高訪問數據庫的效率,可以對數據庫使用索引。當數據庫較大時,為了查找指定的記錄,則使用索引和不使用索引的效率有很大差別。索引實際上是一種特殊類型的表,其中含有關鍵字段的值(由用戶定義)和指向實際記錄位置的指針,這些值和指針按照特定的順序(也由用戶定義)存儲,從而可以以較快的速度查找到所需要的數據記錄。

2.2.6 查詢 / Query

一條SQL(結構化查詢語言)命令,用來從一個或多個表中獲取一組指定的記錄,或者對某個表執行指定的操作。當從數據庫中讀取數據時,往往希望讀出的數據符合某些條件,並且能按某個字段排序。使用SQL,可以使這一操作容易實現而且更加有效。SQL是非過程化語言(有人稱為第四代語言),在用它查找指定的記錄時,只需指出做什麽,不必說明如何做。每個語句可以看作是一個查詢(query),根據這個查詢,可以得到需要的查詢結果。

2.2.7 過濾器 / Filter

過濾器是數據庫的一個組成部分,它把索引和排序結合起來,用來設置條件,然後根據給定的條件輸出所需要的數據。

2.2.8 視圖 / View

數據的視圖指的是查找到(或者處理)的記錄數和顯示(或者進行處理)這些記錄的順序。在一般情況下,視圖由過濾器和索引控制。視圖中並不存儲數據,視圖是一種虛表。

2.3 數據庫類型

2.3.1 關系型數據庫

關系型數據庫是指采用了關系模型來組織數據的數據庫。

關系模型是在1970年由IBM的研究員E.F.Codd博士首先提出的,在之後的幾十年中,關系模型的概念得到了充分的發展並逐漸成為主流數據庫結構的主流模型。

簡單來說,關系模型指的就是二維表格模型,而一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織

關系模型中常用的概念:

關系: 可以理解為一張二維表,每個關系都具有一個關系名,就是通常說的表名

元組: 可以理解為二維表中的一,在數據庫中經常被稱為記錄

屬性: 可以理解為二維表中的一,在數據庫中經常被稱為字段

: 屬性的取值範圍,也就是數據庫中某一列的取值限制

關鍵字: 一組可以唯一標識元組的屬性,數據庫中常稱為主鍵,由一個或多個列組成

關系模式: 指對關系的描述。其格式為:關系名(屬性1,屬性2, ... ... ,屬性N),在數據庫中成為表結構

關系型數據庫的優點:

容易理解: 二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易理解

使用方便: 通用的SQL語言使得操作關系型數據庫非常方便

易於維護: 豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗余和數據不一致的概率。

2.3.2 非關系型數據庫

非關系型數據庫提出另一種理念,例如,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會局限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據需要去添加自己需要的字段,這樣,為了獲取用戶的不同信息,不需要像關系型數據庫中,要對多表進行關聯查詢。僅需要根據id取出相應的value就可以完成查詢。但非關系型數據庫由於很少的約束,他也不能夠提供像SQL所提供的where這種對於字段屬性值情況的查詢。並且難以體現設計的完整性。他只適合存儲一些較為簡單的數據,對於需要進行較復雜查詢的數據,SQL數據庫顯的更為合適。

由於非關系型數據庫本身天然的多樣性,以及出現的時間較短,因此,不想關系型數據庫,有幾種數據庫能夠一統江山,非關系型數據庫非常多,並且大部分都是開源的。

這些數據庫中,其實實現大部分都比較簡單,除了一些共性外,很大一部分都是針對某些特定的應用需求出現的,因此,對於該類應用,具有極高的性能。依據結構化方法以及應用場合的不同,主要分為以下幾類,

面向高性能並發讀寫的key-value數據庫:

key-value數據庫的主要特點即使具有極高的並發讀寫性能,Redis,Tokyo Cabinet,Flare就是這類的代表。

面向海量數據訪問的面向文檔數據庫:

這類數據庫的特點是,可以在海量的數據中快速的查詢數據,典型代表為MongoDB以及CouchDB。

面向可擴展性的分布式數據庫:

這類數據庫想解決的問題就是傳統數據庫存在可擴展性上的缺陷,這類數據庫可以適應數據量的增加以及數據結構的變化。

2.3.3 NoSQL

NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關系型的數據存儲,相對於鋪天蓋地的關系型數據庫運用,這一概念無疑是一種全新的思維的註入。

2.4 數據庫相關知識

2.4.1 Schema(模式)dbo

關於Schema的理解來自於這個鏈接

SQL中有一個Schema的概念,實際上Schema就是數據庫對象的集合,這個集合包含了表、視圖、存儲過程、索引等,為了區分不同的集合,就需要給不同的集合起不同的名字,默認情況下一個用戶對應一個集合,用戶的schema等於用戶名,並作為該用戶缺省schema。所以schema集合看上去像用戶名。

如果把database看作是一個倉庫,倉庫很多房間(schema),一個schema代表一個房間,table可以看作是每個房間中的儲物櫃,user是每個schema的主人,有操作數據庫中每個房間的權利,就是說每個數據庫映射的user有每個schema(房間)的鑰匙。

我們訪問一個表時,沒有指明該表屬於哪一個schema中的,系統就會自動給我們在表上加上缺省的shema名。在數據庫中一個對象的完整名稱為schema.object,而不屬user.object。

在MySQL中創建一個Schema和創建一個Database的效果好像是一樣的,但是在sqlserver和orcal數據庫中效果又是不同的。

在SQL Server 2000中,user和schema總有一層隱含的關系,讓我們很少意識到其實user和schema是兩種完全不同的概念,假如我們在某一數據庫中創建了用戶Bosco,那麽此時後臺也為我們默認的創建了schema【Bosco】,schema的名字和user的名字相同。

在SQL Server 2005中,為了向後兼容,當用sp_adduser存儲過程創建一個用戶的時候,sqlserver2005同時也創建了一個和用戶名相同的schema,然而這個存儲過程是為了向後兼容才保留的,當我們用create user創建數據庫用戶時,我們可以為該用戶指定一個已經存在的schema作為默認的schema,如果我們不指定,則該用戶所默認的schema即為dbo schema,dbo房間(schema)好比一個大的公共房間,在當前登錄用戶沒有默認schema的前提下,如果你在大倉庫中進行一些操作,比如create table,如果沒有制定特定的房間(schema),那麽你的物品就只好放進公共的dbo房間(schema)了。但是如果當前登錄用戶有默認的schema,那麽所做的一切操作都是在默認的schema上進行。

Oracle數據庫中不能新建一個schema,要想創建一個schema,只能通過創建一個用戶的方法解決,在創建一個用戶的同時為這個用戶創建一個與用戶名同名的schem並作為該用戶的缺省shcema。即schema的個數同user的個數相同,而且schema名字同user名字一一對應並且相同。

參考鏈接


http://blog.csdn.net/znyyjk/article/details/52717336

https://en.wikipedia.org/wiki/Transact-SQL

http://blog.csdn.net/op_zoro/article/details/8143024

http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html

http://www.cnblogs.com/zbseoag/archive/2013/03/19/2970004.html

http://www.cnblogs.com/lrl45/p/5923444.html

http://blog.csdn.net/robinjwong/article/details/18502195/

http://www.cnblogs.com/csniper/p/5509620.html

Python與數據庫[0] -> 數據庫概述