當業務複雜化,咱們就須要外鍵關聯,而對於高頻CRUD的表,外鍵關聯具有的強耦合,會致使維護成本偏高。sql
這時,開始使用中間表,中間表的瓶頸在於:數據的數量級將極大影響效率。數據庫
最終,咱們找到了視圖。函數
視圖是一個虛擬表,它存在、可被查詢,卻很難修改、不建議修改(具有多種限制)。優勢在於:視圖的字段由咱們定義,這樣大大的優化了查詢效率。
(能夠想象,視圖查詢實際上是對格式化表的查詢)優化
每次查詢視圖,數據庫都將顯示最新的數據。
每次修改數據,數據庫都將同步到基礎表(若是規則容許的話)。code
分拆表、重構數據庫,視圖保證了業務邏輯不變ci
視圖做爲格式化表,有效遮蔽了保密數據同步
下列代碼建立了一個名爲table_test的簡單視圖。it
CREATE VIEW table_test AS( SELECT s.id AS id, u.city AS city, u.username AS username, u.age AS age, c.people AS people, c.area AS area FROM user u, city c WHERE u.cityid = c.id );
接下來,咱們對這個視圖的結構,進行修改。(再次重申,不建議修改視圖數據)table
ALTER VIEW table_test AS( SELECT s.id AS id, u.city AS city, u.username AS username, c.people AS people, c.area AS area FROM user u, city c WHERE u.cityid = c.id );
儘管有各類各樣的原則,去建議你們不對視圖作修改,但業務場景永遠高於理論原則,因此在這裏,列出 「擁有如下結構,將不能修改視圖數據」:class
聚合函數(SUM(), MIN(), MAX(), COUNT()等)。
DISTINCT
GROUP BY
HAVING
UNION或UNION ALL
位於選擇列表中的子查詢
Join
FROM子句中的不可更新視圖
WHERE子句中的子查詢,引用FROM子句中的表。
僅引用文字值(在該狀況下,沒有要更新的基本表)。
ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成爲不可更新的)。