2010-11-18 80 views
0

Brief:我對數據庫相當陌生,目前有兩個表格用於檢查器類型腳本。有沒有辦法確保兩個表使用相同類型的列?該數據庫位於Sybase中。強制多個表在數據庫中具有相同的列

詳細信息:第一個表基本上是一個日誌有史以來對腳本做所有支票(假設有106個檢查在一次運行,所以這將X [否檢查< 106 [奔跑的編號] >])。第二張表是最後一次運行,所以在這種情況下,它將包含106行。然而,這並不是一個常數,而且可能會增加。

我的問題是,有沒有辦法強制兩個表都有共同的列?我在syscolumns表中看到,有多個專用於這些表的行,但由於它們是相同的,我能以某種方式讓這些表從相同的源中抽取它們的「style」(模式正確)參數,所以其中一個的變化是在另一個上進行的?

謝謝!

+0

你的意思是你想要它,這樣如果表中一列的定義改變了,你想要對另一列做出同樣的改變嗎?例如,如果一列從char更改爲varchar,那麼您希望另一列從char更改爲varchar? – YWE 2010-11-18 14:30:52

+0

是的,這正是我的意思 – Bharat 2010-11-18 14:46:37

+0

你應該使用用戶定義的數據類型**所有**的時間,並且從不使用原始數據類型。否則,您無法控制數據,這正是您的問題中確定的原因。 – PerformanceDBA 2010-12-05 14:57:41

回答

1

管理多列和數據類型之間關係的一種方法是使用用戶定義的域。一些DBMS系統支持用戶定義的域。其他不要

SQL中的動詞是「CREATE DOMAIN」。您可以在文檔中查找具體內容。

然後,當您創建表格並創建組成表格的列時,可以使用您創建的域名而不是指定數據類型和相關參數。當兩列被引用到相同的域時,它們保證具有相同的數據類型。它們也保證具有相同的尺寸,如「char(7)」中的「7」。

以真正提高您通過抽象簡化數據管理的能力創建域的過程涉及學習和經驗。你必須從某個地方開始。

+0

Sybase顯然不明確支持用戶定義的域,但我可以創建自定義數據類型。我會給它一個鏡頭,謝謝! – Bharat 2010-11-18 14:47:58

+0

在Sybase中,它們被稱爲ANSI標準名稱,INTEGER的數據類型等(Walter在邏輯術語中稱爲Domains);規則的域名。他們受到支持。 – PerformanceDBA 2010-12-05 14:56:10

2

如果您需要具有完全相同列結構的多個表,則規範化建議數據可能全部屬於單個表內。

我知道通過反規格化數據可以找到一些好處,但是由於您承認您是數據庫新手,因此我會盡量找到一種首先進行規範化的方法。

+0

我明白你在說什麼,並且由於較小表中的所有數據都存在於較大的表中,所以基本上是重複的。但我的思路是,保留兩個表意味着第一個表是日誌,而需要所有系統的當前狀態的應用程序可以簡單地(SELECT *)。第二個數據庫只有在插入語句後纔會更新。通過這種方式,界面更簡單,應用程序無需查詢日誌即可獲取最後一次可用的檢查(如果檢查未能寫入日誌)。那有意義嗎?它仍然不值得非正常化的狀態嗎? – Bharat 2010-11-18 14:56:16

+0

這聽起來像這可能保證非規範化。但是,在適當的RDBMS中,索引良好的表應該表現得很好,即使很大。如果將數據存儲在兩個表中,還可能會使日誌與當前狀態不同步。 – Tenner 2010-11-18 15:23:15

+0

@Bharat。所以讓你的應用程序'選擇TOP 1 ORDER BY Id DESC'並丟失多餘的表。 – PerformanceDBA 2010-12-05 14:59:39

1

你描述了一個奇怪的情況。一般來說,一旦表格被設計和實現並且應用程序開始使用它們,它們就不會被改變。當然,他們在正常的業務過程中(即每天甚至每週)很少發生變化。

在什麼情況下您會看到需要額外的欄目?如果是反覆出現的情況(並且我有這些情況),那麼您會編寫一個程序來添加列,這將確保表保持同步。如果表格要「手動」更改,通常由具有管理員權限的人員完成,管理員可以執行他們(可能錯誤地)想要執行的任何操作,而不考慮原始設計者的意圖。這裏最好的防禦方法是記錄系統需求,並確保他們對可能需要使用表的任何人都是已知的和可用的。

+0

謝謝,表格在實施後並不會真正改變,但我仍然在實施它們,並想知道是否有辦法讓我(和未來維護者)的生活變得更容易一些。文件可能是這種情況下的方法。 – Bharat 2010-11-19 14:16:05

相關問題