簡體   English   中英

同一列的不同類型

[英]Different Types for the Same Column

我的數據庫存儲版本號; 但是,它們有兩種格式:major.minor.build(例如8.2.0,12.0.1)和日期(例如YY-MM-DD)。 我曾想過兩個解決方案:

+---+---+-----+-----------+ +-----+-----+-----+-----+ +-----+--------+
|...|...|id   |versionType| |id   |major|minor|build| |id   |date    |
|---+---+-----+-----------| |-----+-----+-----+-----| |-----+--------|
|...|...|12345|0          | |12345|0    |1    |2    | |21432|12-04-05|
|---+---+-----+-----------| +-----+-----+-----+-----+ +-----+--------+
|...|...|21432|1          |
+---+---+-----+-----------+

要么

+---+---+-----+-----+-----+-----+--------+
|...|...|id   |major|minor|build|date    |
|---+---+-----+-----+-----+-----+--------|
|...|...|12345|0    |1    |2    |null    |
|---+---+-----+-----+-----+-----+--------+
|...|...|21432|null |null |null |12-04-05|
+---+---+-----+-----+-----+-----+--------+

這些都不是特別有效:第一個需要跨兩個表連接才能獲得版本號,而第二個需要每個版本條目的空間是第一個的兩倍。 或者,我可以將值存儲在一列中的某些位,然后在客戶端解釋,但我希望這種情況有一些我忽略的標准做法。

是否有適當的方法為關系數據庫中的同一“列”存儲兩種不同類型的數據?

您的情況是您有不同類型的版本化對象,其中一種版本控制使用日期,另一種版本控制使用版本號,或者您的情況是使用日期引用相同類型的對象版本並使用版本號?

在第一種情況下,不要打擾創建這樣一個沒有任何用處的人工表。 只有在解決了真正存在的業務問題時才需要創建表,並且從版本日期到版本號的轉換或反之亦然是在這種情況下不存在的表。 即使它后來出現,你仍然可以......

在第二種情況下,定義一個類似於第二個選項中的表,但是:

沒有所有那些愚蠢無意義的ID。 只需留下四列maj / min / bld / date。 並且不要讓任何它們無法使用。 定義兩個鍵:maj / min / bld和date。 為每個新構建注冊一行,記錄構建的創建(/ activation / whatever ...)日期。 在任何描述您正在管理的版本化對象的表中使用maj / min / bld構造作為版本指示符,並且每當使用日期完成版本引用的請求時,通過查詢將其解析為版本號你的4列表。

第一個更好。 如果您覺得每次進行連接都很困擾,那么您可以創建一個視圖(使用連接)並使用該視圖而不是直接使用表(或每次都進行連接)。

我不認為這里有一顆銀彈。 如果你堅持擁有一個列,你可以天真地將它們都打到CHAR(10)中,盡管這有它自己的問題(例如,無效的日期,或者格式錯誤的構建數字串等)。

我認為關鍵問題是你想要運行什么類型的查詢,以及你期望有多少行?

我讓預期的查詢需要驅動數據庫設計。

可能您可以將數據存儲在一個int / bigint字段中。 但在這種情況下,您將必須轉換所有值:日期 - 將其轉換為從某個日期開始的天數,或者您可以使用unixtimestamp版本 - 限制內置值(讓它最大為1000),次要(1000) )。 = major * 1000 * 1000 + minor * 1000 + build

我會使用第二個選項,因為表的粒度是一個版本,無論它是如何進入的。將它存儲在3個數字列和1個日期列中每行應該只有16個字節(每個數字和日期列4個字節) )在像Oracle這樣的數據庫上。 如果您的數據庫處理虛擬(計算)列,您可以添加一個類似於nvl(to_char(date),major ||'。'|| minor ||'。'|| build)的列,並始終從中選擇數據格式化為varchar或您可以在其上放置視圖。

這實際上取決於您希望如何在查詢中使用此版本號。 如果足以將版本號視為標簽,那么您應該考慮將其存儲在varchar列中。

如果這還不夠,並且您希望能夠對版本號進行排序,則事情變得更加復雜,因為將版本號存儲在保留自然排序順序的數據類型中會更方便。 我可能會選擇你的解決方案2.有理由擔心效率嗎? 你期待數百萬行嗎? 如果沒有,那么你可能不應該太擔心。

如果空間,速度和體積是明確的考慮因素,您可以考慮將實際版本號存儲為文本標簽,並導出存儲在用於排序目的的單獨列中的代理版本號(單個整數)。

另一方面,如果事實證明某些對象有版本日期,有些是版本號,有時兩者都有,我仍然會考慮你的第二個解決方案。 如果您真的想要一個超級規范化的模型,您可以考慮創建單獨的version_date和version_number表,它們與對象表具有1:1的關系。 你仍然需要這些連接。 盡管如此 - 沒有理由擔心這一點:數據庫擅長連接,這是他們做得好的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM