要不要冗餘字段

2021-09-07 06:28:27 字數 2866 閱讀 9750

這個問題我糾結了老長時間,至今仍未想明白。

但是與其萬馬齊喑不如胡說八道。

如果使用者表新增計數字段,好處在於用空間換時間,查詢速度肯定快多了;如果追求簡潔無冗餘,好處在於清晰易懂,寫**不蔓不枝,特別漂亮。

如果不設計冗餘字段,也慢不了多少,建立完外來鍵或者索引之後查詢速度會提公升很多。如果覺得這麼整寫sql語句會變長不如冗餘字段好看,那也簡單,建立檢視呀,看上去跟冗餘字段差不多,但它的內心卻是十分純潔不像冗餘字段繁瑣難維護。

如果冗餘字段可控容易維護,那麼維護它;如果冗餘欄位不可控,那麼冗餘的毫無價值,刪除掉追求簡潔。

存在未必合理,合理的是永遠存在的。別說:人家既然設計了這個功能,那肯定有人家的道理。

沒道理,存在未必合理。要用自己的眼光去看清用自己的大腦去分析。

結末的結論便是:用檢視+查詢語句+外來鍵cascade級聯刪除來替代冗餘字段。

乙個小樣例來測試級聯刪除與觸發器(基於mysql):

只有三個表:使用者,話題,帖子。建立完後,插入乙個使用者,乙個話題,乙個帖子。此時發現使用者的話題數,帖子數都變成了1。

然後刪除話題,發現使用者的話題數變為0,帖子數卻不發生變化,這表明話題級聯刪除了帖子,卻沒有觸發帖子的刪除事件。

drop

database

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界,有一句很經典的話 不要重複造輪子!我們要敏捷開發,快速迭代。這句話意思是說在已有技術可以解決需求的前提下我們不需要再重新實現乙個模組來實現功能,哪怕這個技術是第三方的。在當下,網際網路產品迭代更新的階段,公司業務需求變更頻繁,編碼與搬磚無異,這句話被很多人奉為圭臬,甚至是很多人 指導思想 ...

分割槽依據欄位要不要再建索引

分割槽依據欄位要不要再建索引呢?要的。雖然表已經根據此欄位分割槽,但這不能等同於索引。分了區,只能說該字段為某個值的記錄會在某個分割槽裡面,但不是索引,還要一頓好找。有時候,主鍵不等於分割槽依據列,這時候主鍵又想建聚集索引的話,那麼必須包含分割槽依據列,搞成復合主鍵。那麼,這種情況下,分割槽依據列不...