Discussion:
primary key 的資料型態
(时间太久无法回复)
銀色
2007-08-24 18:28:28 UTC
Permalink
※ 引述《kong (Life of Music)》之銘言:
以上是一點小例子,至於哪個方法好,我想見仁見智
主要仍是看對設計者而言,怎樣比較方便
至於速度問題,我就不那麼重視了
畢竟真要要求的話,我們應該自己設計硬體,並且從組合語言開始自己寫DBS
但顯然我們沒有餘力這樣做。
[恕刪]

真的看不懂原作者的意思。(反覆看了八次)
不過還是可以稍微提一些自己的經驗。

auto_increace 主要的目是在於提供一組簡短的,可供辨識的 unique pky,
而附加價值的是在於 sequence order 之類的其他應用。

一般而言在 pky 設計上只要能達到 unique 目的,其實有很多種方式可以。
鬆散的以 timestamp 而言,嚴謹一點如 md5 (unique) ,
甚至一般大家的 personal id 也可做到。

但是這些不同 pky 所佔用的儲存空間,
或是在 query 處理時需要消耗的暫存記憶卻是不盡相同的。
現在電腦之發達,讓這種差異性極難被注意,
但如果是在有限(非常有限)的記憶體系統上實做時,
每一個儲存都會被要求得很仔細,絕不能浪費,否則本來預估的 3000 筆資料,
最後卻發現只能存進 2600 筆,就因為多使用了空間在規劃 pky 儲存上。

而原作者所提到,我稍稍能看懂的部份,是在於要賦予 pky 意義這點。
不過我和原作者所站的立場截然不同。

畢竟今天資料庫是設計給程式使用的,並不是給一般使用者,
在讓程式了解/讓使用者了解這兩方面,若是有所取捨,我必然是選擇
讓程式了解為優先。

一來是封裝,在程式物件化中也有這個概念,讓一般使用者所接收到的
『系統設計訊息』是越少越好,封裝過後的資訊可以有效保障系統的安全性
(雖然用處有限),並降低資料傳遞間的複雜度。

二來是程式本身並不是寫給使用者看的,是寫給使用者使用,
而實際上有機會去閱讀的多半都是自己或著團隊中的他人,
這種封裝過後的資訊是一開始便要制定好的規格,而非是經由透明化的過程讓它
得以被閱讀/使用。

就像有些老一輩的 myqsql user ,至今不會想去使用 enum 是同樣的道理,
一些以 tinyint 或 boolean 便可解決的東西,為何要透過 enum 來實做?
(當然 enum 有它存在的重要性與特點,這是不容置否的)


好像有點偏離了 XD

回到原作者的文章,要透過一次判斷或兩次判斷來取得權限,
或是進行能否處理資料的判斷,那 完全是資料庫設計的問題 。
與使不使用 auto_increace 全然無關。

你賦予一個 member_table 中 id = xxxx 的資料是表示 xxxx 此人,
那麼你當然也可以賦予他 id = 1 來表示是此人的意義。

而在 member attribute 中,您當然也可以選擇要以 id = xxxx 或 id = 1
來做為對此人的 unique (pky) 判斷。

使用 auto_increace 對我而言絕非是壞習慣,
當然並不是每個 table 都需要使用 auto_increace,
如果一個 table 本身並不需要 pky ,
或著 pky 已經可以被他本身所具有的 unique data 所取代,
那麼當然是否需要 auto_increace 也就不言而喻了。

資料庫的設計,往往決定了一切。

--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天下61.229.46.74海
銀色
2007-08-25 07:24:05 UTC
Permalink
敝人只是在表達對於『我只知道用auto_increment不是個好習慣..XD』
,以及後來相關解釋的看法而已 XD


還是弄不大清楚,您的觀點上究竟為什麼使用 auto_increment 不是個好習慣?

另外,對於您在文末的以下這段話中提到的速度,敝人也有著自己的看法,

以上是一點小例子,至於哪個方法好,我想見仁見智
主要仍是看對設計者而言,怎樣比較方便
至於速度問題,我就不那麼重視了
畢竟真要要求的話,我們應該自己設計硬體,並且從組合語言開始自己寫DBS
但顯然我們沒有餘力這樣做。


關於一個網站架構系統的速度要求,
雖然可以透過重製硬體及改善伺服器系統(這裡敝人指的是
涵蓋 os 乃至於 http server/db server 等等)來追求,
但那應該不是主要的方式吧。

同樣一個 web structure ,透過不同的資料庫設計以及程式撰寫方式,
可以讓它在達到八十萬筆或數百萬筆資料時,依然順暢運作,
而且能讓它幾乎所有的 db operate 都維持在一定的秒數裡,
這其中需要的是對 db 每一組 query 的細細要求,
仔細劃分對於 db 和 server language 的專長指派(畢竟 db 和伺服器語言
在不同的運算上各有所長),和審慎的資料庫設計。

敝人雖然不才,但也見識過神人前輩接手維護一台老舊的 asp/mssql server,
只靠著微調資料庫和改變 query command ,便將運作時間從原本的 3 分鐘
,壓至 50 秒內,針對取出同樣龐大資料庫裡的五十筆橫跨多組 table 的複合資料。


(以上只是敝人對於改善網站運作速度的看法啦 XD)


--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天 61.57.130.248海
銀色
2007-08-25 07:55:18 UTC
Permalink
※ 引述《kong (Life of Music)》之銘言:
以搜尋會員的例子來說,我們確實可以使用sn來找到指定的會員
但是我們通常並不會以sn作為UI上顯示的東西
是以若是仍要用auto_increment(本系列討論的重點)
在"以屬性搜尋會員帳號"的這個需求裡,仍然要跨table
我知道這樣沒有正規化
但是若是都要正規化,其實就不會有"用auto_increment是不是好習慣"的問題了
我假設我們之所以要討論auto_increment的方便性,就是因為不那麼在意正規化
如果各位學過第四正規化以上的東西,應該知道正規化並不是做的越徹底越好..
正規化當然不是越徹底越好,實際上一個高複雜度的資料庫設計,
也是不可能做到完整的正規劃的。 XD

回到 auto_increment,在『以屬性搜尋會員帳號』的這個需求裡,
跨 table 並不是必須的,這是資料庫設計上的問題。

誠如敝人之前所言, auto_incremant 是一個作為 pky 的良好指標,
但它不一定是必需品,如果一個 table 中,
您已經設計且確定它的會員帳號是一組 unique key,那麼當然可以
用此作為此 table 的 pky。

更進一步,如果在此 table 中,您可以確定 personal id + birthday
是一組 unique key ,那麼當然也可以以此作為複合式的判斷條件,
連帳號都可以不必規劃進來。


重點還是在於 db 要如何設計。 XD


--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天 61.57.130.248海
Life of Music
2007-08-25 10:17:51 UTC
Permalink
※ 引述《gpmm (銀色)》之銘言:
Post by 銀色
敝人只是在表達對於『我只知道用auto_increment不是個好習慣..XD』
,以及後來相關解釋的看法而已 XD
還是弄不大清楚,您的觀點上究竟為什麼使用 auto_increment 不是個好習慣?
@.@
可能我當初沒有清楚表達..

我的本意是針對"每個table都使用auto_increment"這件事情不是好事

即使不論速度上的差異
如果在不需要的地方也都有用auto_increment來產生的PK的話
長久下來,會造成程式設計者對於資料庫本身的生疏

我並不同意您提到應該"以讓程式了解為優先"這個部份
在開發的成本上,目前並沒有定論說應該孰輕孰重
學術上我們可以忍受10年讓速度成長10%
但是業主並不一定會忍受開發團隊花10個月卻只讓系統提升10%
Post by 銀色
另外,對於您在文末的以下這段話中提到的速度,敝人也有著自己的看法,
至於速度問題,我就不那麼重視了
畢竟真要要求的話,我們應該自己設計硬體,並且從組合語言開始自己寫DBS
但顯然我們沒有餘力這樣做。
關於一個網站架構系統的速度要求,
雖然可以透過重製硬體及改善伺服器系統(這裡敝人指的是
涵蓋 os 乃至於 http server/db server 等等)來追求,
但那應該不是主要的方式吧。
我尊重您對於"主要"的界定
但是我仍認為那是一個可行的辦法
因為那是我們所要求的"速度"的解決辦法之一

之後的部分跟auto_increment無關,大致同意,恕刪
但我曾經把MySQL花20分鐘跑到當機的一句SQL,變成2秒可以跑完

--
不試試看怎麼會知道呢?
http://www.blogger.com/profile/11945789762117331374
--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天218.170.115.59海
 weiyu:我覺得 當初沒加上「每個table」這幾個字 08/25 18:17
 weiyu:意思差很多 08/25 18:17
銀色
2007-08-25 13:15:29 UTC
Permalink
※ 引述《kong (Life of Music)》之銘言:
Post by Life of Music
@.@
可能我當初沒有清楚表達..
我的本意是針對"每個table都使用auto_increment"這件事情不是好事
即使不論速度上的差異
如果在不需要的地方也都有用auto_increment來產生的PK的話
長久下來,會造成程式設計者對於資料庫本身的生疏
這邊我同意,
不必要的欄位設計只是單純在增添系統的負擔而已。
Post by Life of Music
我並不同意您提到應該"以讓程式了解為優先"這個部份
在開發的成本上,目前並沒有定論說應該孰輕孰重
學術上我們可以忍受10年讓速度成長10%
但是業主並不一定會忍受開發團隊花10個月卻只讓系統提升10%
不敢揣測您是否有待在業界過,您說:

學術上我們可以忍受10年讓速度成長10%,
但是業主並不一定會忍受開發團隊花10個月卻只讓系統提升10%

這是非常事實的。 XD
但是關於開發成本,也許有待過業界的人會比較有切身之感。

國內資訊界的 OS 或軟體系統開發是非常緩慢的,大多數是學術單位的研發成果,
再轉由專案或其他方式和業界合作生產,
因為生態的關係,業界多數的開發都是以速度為前提,以利潤掛帥。
別說是 server 了,即或是 pc software,手機的 os,
都是再這種前提下進行研發的。

(許多在台美日商各公司的同學,每次聚會可是苦水吐都吐不完 XD)

因此要透過研發 base 的軟體系統體來提昇伺服器運作效能,
那幾乎是不可能的方式。

以業界而言,對案主來說花的錢越少,能夠拿到的東西越好,這就是他們想要的。
開發成本?那是自己公司內部要去傷腦筋的事。他們只會給你相同的錢。

遺憾的是,公司內部不可能花錢來提升別人的硬體設配,因為利潤要取得越多越好,
公司是需要錢來養的。

所以這種縮減成本的重責大任就落到工程師身上了,
要能在有限的硬/軟體環境寫出高效率的程式,這對公司而言才是最合乎成本的。

也許綜觀大環境,深層系統的開發比起末端的程式設計要來的有價值,
但是在業界(以我認之的台灣業界而言),沒有人會允許你這樣做,
除非是自己出來開公司吧。 XD

也許有人會想,既然案主的錢有限,那麼就給它相對應的產品就好了。
何必要工程師苦苦提昇程式效能?

以自己身在的網路界,小小私人公司不會特別在意,因為他們網站/系統的
曝光率並不高,使用人數也不會拉衝到哪。

但可怕的是政府案,如果有人指點的話,它甚至會在合約裡註明,
限定每一個頁面的開啟時間不能超過多少秒。而且它系統使用人員的涵蓋之廣,
是非常難以想像的。

簡單舉個例子,倘使台灣有百分之三的豬農在配合政府使用您所開發的某某系統,
那麼系統的 loading 會有多重就可以想像了。 XD

如果平常撰寫程式或設計系統的習慣,總是把程式寫給人看,而非是寫給系統看,
那麼在做這種案子的時候,很快就會嚐到苦果。 XD

(通常是系統上線的一兩個月後吧 XD)
Post by Life of Music
我尊重您對於"主要"的界定
但是我仍認為那是一個可行的辦法
因為那是我們所要求的"速度"的解決辦法之一
而我(們)常常會覺得自己所習慣的部份才是主要的 XD
哈,這的確是 :)

尊重您對於系統速度的解決方式,
不過我也只是想表達一些身在其中的看法。
Post by Life of Music
之後的部分跟auto_increment無關,大致同意,恕刪
但我曾經把MySQL花20分鐘跑到當機的一句SQL,變成2秒可以跑完
這個我就沒什麼好說了,
也許每個人的實力不同吧。 XD



--
夫兵者不祥之器物或惡之故有道者不處君子居則貴左用兵則貴右兵者不祥之器非君子
之器不得已而用之恬淡為上勝而不美而美之者是樂殺人夫樂殺人者則不可得志於天下
矣吉事尚左凶事尚右偏將軍居左上將軍居右言以喪禮處之殺人之眾以哀悲泣之戰勝以
喪禮處之道常無名樸雖小天下莫能臣侯王若能守之萬物將自賓天地相合以降甘露民莫
之令而自均始制有名名亦既有夫亦將知止知止可以不殆譬道之在天 61.57.130.248海
Loading...