這個問題我糾結了老長時間,至今仍未想明白。
但是與其萬馬齊喑不如胡說八道。
如果使用者表新增計數字段,好處在於用空間換時間,查詢速度肯定快多了;如果追求簡潔無冗餘,好處在於清晰易懂,寫**不蔓不枝,特別漂亮。
如果不設計冗餘字段,也慢不了多少,建立完外來鍵或者索引之後查詢速度會提公升很多。如果覺得這麼整寫sql語句會變長不如冗餘字段好看,那也簡單,建立檢視呀,看上去跟冗餘字段差不多,但它的內心卻是十分純潔不像冗餘字段繁瑣難維護。
如果冗餘字段可控容易維護,那麼維護它;如果冗餘欄位不可控,那麼冗餘的毫無價值,刪除掉追求簡潔。
存在未必合理,合理的是永遠存在的。別說:人家既然設計了這個功能,那肯定有人家的道理。
沒道理,存在未必合理。要用自己的眼光去看清用自己的大腦去分析。
結末的結論便是:用檢視+查詢語句+外來鍵cascade級聯刪除來替代冗餘字段。
乙個小樣例來測試級聯刪除與觸發器(基於mysql):
只有三個表:使用者,話題,帖子。建立完後,插入乙個使用者,乙個話題,乙個帖子。此時發現使用者的話題數,帖子數都變成了1。
然後刪除話題,發現使用者的話題數變為0,帖子數卻不發生變化,這表明話題級聯刪除了帖子,卻沒有觸發帖子的刪除事件。
dropdatabase
ifexists
test;
create
database
test;
usetest;
drop
table
ifexists
user
;create
table
user
( id
int auto_increment primary
key,
postcount
int,
topiccount
int);
drop
table
ifexists
topic;
create
table
topic (
id int auto_increment primary
key,
title
varchar(10
), userid
int,
postcount
int,
foreign
key(userid)references
user(id) on
delete
cascade
);drop
table
ifexists
post;
create
table
post (
id int auto_increment primary
key,
content
varchar(10
), topicid
int,
userid
int,
foreign
key(topicid)references topic(id) on
delete
cascade
,
foreign
key(userid)references
user(id) on
delete
cascade
);delimiter ;;
create
trigger ai_topic after insert
on topic for
each row
begin
update
user
set topiccount=topiccount+
1where
user.id=
new.userid;
end;;
create
trigger ad_topic after delete
on topic for
each row
begin
update
user
set topiccount=topiccount-
1where
user.id=
old.userid;
delete
from post where topicid=
old.id;
end;;
create
trigger ai_post after insert
on post for
each row
begin
update
user
set postcount=postcount+
1where
user.id=
new.userid;
update topic set postcount=postcount+
1where topic.id=
new.topicid;
end;;
create
trigger ad_post after delete
on post for
each row
begin
update
user
set postcount=postcount-
1where
user.id=
old.userid;
update topic set postcount=postcount-
1where topic.id=
old.topicid;
end;;
delimiter ;
Excel要不要「引」
雙引號在excel公式中無處不在,我們有必要了解它的用法。一 什麼時候需要加 1 表示空字元。if a1 a1 10 意思是如果a1的值為空,則顯示空白,否則返回a1 10 2 字串 表示文字,在公式中文字兩邊都需要加雙引號。countif a a,abc 意思是統計a列的為 abc 的個數。3 日...
要不要造輪子?
在it界,有一句很經典的話 不要重複造輪子!我們要敏捷開發,快速迭代。這句話意思是說在已有技術可以解決需求的前提下我們不需要再重新實現乙個模組來實現功能,哪怕這個技術是第三方的。在當下,網際網路產品迭代更新的階段,公司業務需求變更頻繁,編碼與搬磚無異,這句話被很多人奉為圭臬,甚至是很多人 指導思想 ...
分割槽依據欄位要不要再建索引
分割槽依據欄位要不要再建索引呢?要的。雖然表已經根據此欄位分割槽,但這不能等同於索引。分了區,只能說該字段為某個值的記錄會在某個分割槽裡面,但不是索引,還要一頓好找。有時候,主鍵不等於分割槽依據列,這時候主鍵又想建聚集索引的話,那麼必須包含分割槽依據列,搞成復合主鍵。那麼,這種情況下,分割槽依據列不...