2013-08-01 36 views
0

一個簡單的數據庫設計問題一直在困擾着我一段時間,我想我會在這裏問。將所有貸款(插入貸款日期,更新返還日期)記錄存入一張表或兩張表(有歷史記錄)是否更好?

假設我有一個數據庫表,"Loan"具有以下字段,

StudentIdentification, LoanDate, ReturnDate 

此表用於跟蹤每一個誰已借出的東西(而不是在數據庫)的學生。 由於每個學生都可以貸款,返回和貸款再次(但並非沒有返回,貸款必須跟一個還貸款多次),複合主鍵是

used: StudentIdentifcation and LoanDate 

是更好地存儲數據,這樣或代替具有2個表,

table 1: Loan (StudentIdentification, LoanDate) 
table 2: LoanHistory (StudentIdentification, LoanDate, ReturnDate) 

在這種情況下,貸款表的主鍵是

StudentIdentification 

和LoanHistory表的主鍵是

StudentIdentification, LoanDate 

每次學生返回時,「貸款」記錄被移動到「LoanHistory」表與ReturnDate更新(在交易完成)。

哪個更好?

+0

哈哈,編程白癡**與訪問SO **,這是差異 –

+0

真的,我的評論被刪除?主持人沒有注意到OP的用戶名實際上是「編程白癡」?男人,這些日子裏,每個人都很敏感。 –

回答

1

我會創建一個表,然後使用篩選索引(SQL Server 2008+)或索引視圖(SQL Server 2005-)來強制每個學生只有一行,返回日期爲NULL

CREATE TABLE Loans (
    StudentID int not null, 
    LoanDate datetime not null, 
    ReturnDate datetime null, 
    constraint PK_Loans PRIMARY KEY (StudentID,LoanDate), 
    constraint CK_Loans_NoTimeTravel CHECK (LoanDate < ReturnDate) 
) 

篩選索引:

CREATE UNIQUE INDEX IX_Loans_SingleOpen ON Loans (StudentID) WHERE ReturnDate IS NULL 

索引視圖:

CREATE VIEW dbo.Loans_SingleOpen_DRI 
WITH SCHEMABINDING 
AS 
    SELECT StudentID FROM dbo.Loans WHERE ReturnDate IS NULL 
GO 
CREATE UNIQUE CLUSTERED INDEX IX_Loans_SingleOpen ON Loans_SingleOpen_DRI (StudentID) 

(假設dbo是合適的模式 - 這是需要SCHEMABINDING,這反過來需要創建索引)

1

您可以使用簡單的SCD(緩慢變化的維度)結構並使用一張表來存儲當前和歷史數據。

StudentIdentification, CreationDate, LoanDate, ReturnDate 

前兩列是PK。

您還可以添加一個金額來表示貸款或回報。

您可能會發現this question relvant

1

有三列一個表是做到這一點的最簡單方法。它可以讓你回答如下問題:「2013年3月有多少學生貸款?」容易。如果你有兩個表格,你需要訪問他們兩個來回答這個問題,因爲你實際上有一個「開放式貸款」和「返還貸款」表。

這可能是您的系統對當前開放的貸款非常感興趣。他們可能會經常被查詢和更新。在這種情況下,如果您在一張表中存在當前活動的貸款,那麼它會表現更好,並將歷史記錄推送到次表中。如果你需要保留很多的歷史,但你很少閱讀,這是很好的。

+0

是的,你是對的。在桌子上處理所有東西確實更好,除非在桌子上有很多的問題。好建議 –

0

提供準確的答案更多信息。關於應用程序是需要的。例如,爲什麼沒有帶有StudentId和LoanDate的單個表,主鍵是StudentId。當貸款項目返回時,刪除該行。因此,沒有StudentId記錄,那麼目前沒有任何貸款。這個建議假定LoanDate對於發出延遲提醒很重要。如果不需要延遲提醒,那麼爲什麼還要有LoanDate?

如果您需要貸款記錄,其中包括退貨日期和貸款日期。然後添加第二個歷史記錄表以存儲行,並使用addtional return date字段將它們從貸款表中刪除。

相關問題