2009-09-14 63 views
0

我有兩個表定義如下。索引變量和外鍵

Create table tickets (id long not null, 
reseller long not null, 
constraint pk_lock primary key (id)); 

Create table ticketRegistrations (id long not null, 
customer long not null, 
constraint fkTicketRegistrationTicket 
    foreign key (id) references tickets (id) on update cascade); 

客戶端可以輸入票據(因此不會自動增加主鍵)。由於id是ticketregistrations表的主鍵AND FOREIGN KEY,因此存在完整性約束和所有爵士樂。我遇到的問題是一個功能請求,它允許使用票證ID(即00070)進行零填充。據我所知,整數不能用零填充進行存儲。

我想出了什麼解決方案是在ticket表中添加一個ticketID varchar(8)not null列,並將兩個表的實際id用作代理鍵。票證註冊表的外鍵然後指向ticketid。

我的問題是關於效率和速度。以前,我可以在系統中添加票據註冊,並且數據庫會對添加進行完整性約束,以查看具有相同ID的票證是否在數據庫中。現在我有一個varchar字符串作爲將被索引的id。
當客戶「註冊票證」時,將ttytid varchar保留在票據表中並在票證註冊表中使用ticketid的外鍵(也是varchar(8))會更容易嗎?

或者在ticketregistrations中不存在ticketid varchar(8)會更容易,將ticket的外鍵保留爲ticketregistrations表的主鍵,並首先檢查ticket表中的ticketid,檢索值,並將其輸入到ticketregistrations內的一行中?

這將在每次插入ticketsregistrations表之前在票據表上創建索引varchar搜索。

我的初始解決方案並不需要這個,因爲參照完整性處理了這個問題。

我很擔心尋找時間。

+0

什麼數據庫系統,以及它的版本? – 2009-09-14 17:01:59

回答

1

我有兩個解決方案。

第一個是在票據表中有兩列用於標識符。一個應該是一個僅供內部使用的標識符,用於引用(意思是可以自動增加它)。關鍵是該列不會綁定到任何輸入數據。第二列將包含由用戶輸入的id的字符串表示形式。然後,您可以在第二列添加一個唯一的索引用於搜索目的。

第二個是保持表格原樣,但只有顯示帶零填充到指定長度的ID(即用戶只能輸入6位數字)。所以你需要顯示一個ID的地方,調用一個填充它的函數;當輸入票號時,去除任何填充並轉換爲整數。如果你的問題已經有了圍繞數據庫結構編寫的整個應用程序,那麼這個解決方案將更容易實現。如果您認爲在應用程序的生命週期中數字的數量將是一個變量,它也更加靈活。

如果可行,您可以實現這兩種解決方案,在表中添加第二個數字列,然後執行零填充顯示內容。

無論您最終使用哪種解決方案,都要考慮如果您被要求添加對包含字母和數字的票證標識符的支持時必須更改的內容。

0

我會離開ids和外國ley約束,因爲它們是。添加第二個計算列是varchar,並添加前導零。對所有工作使用第一列並顯示第二列。