創建一個包含與特定批次關聯的測試的TestBatch表。在結果表中使用該表的PK作爲FK。
在任何情況下都需要TestBatch,因爲與特定批次關聯的測試是您需要捕獲的歷史時刻。每次構建新批次時,都可能會添加新的測試,但您不希望它們與較早完成的批次相關聯。
TestBatch加入測試和批處理,幷包含BatchID,TestID和它自己的ID。然後結果表包含來自TestBatch的ID作爲其外鍵。
所以看到針對這個結果,你會從試驗和批量表像這樣既加入結果TestBatch再抓描述細節:
Select r.ResultId, R.Col1, r.col2, b.BatchId, b.batchdate, t.testId, t.Test_description
From Results r
join TestBatch tb on r.TestBatchid = tb.TestBatchid
join Batch b on tb.batchid = b.batchid
join Test t on tb.testid = t.testid
類型將可能被主要用於創建記錄創建批次時的TestBatch。 並加入到上述按類型過濾在這種情況下,您通常只想加入Type到Batch或Test,但不能同時加入。
向你展示一下如何使用數據(現在忘記結果表以及官方FK和PK,你可以在@PhillipKelleys中看到很好的答案)代碼是爲SQL服務器編寫的,我使用了臨時表你可以在提交一個結構之前玩一下,但是如果你想創建真正的表格,可以刪除#號。身份是什麼SQL Server使用創建自動生成的的代碼字段替代數據庫後端做同樣的事情:
Create table #type (Typeid int identity, TypeDescription varchar(100))
Insert into #type (TypeDescription)
values ('Geography'), ('History'), ('Biology'), ('Math')
Create table #Batch (BatchID int identity, TypeID int, BatchDate datetime)
insert into #Batch (TypeID, BatchDate)
values (1, getdate()-1), (1, getdate() +2) , (4, getdate())
Create table #Test (testId int identity, TestDescription varchar(50), TypeId int)
Insert into #Test (TestDescription, TypeId)
values ('fall midterm', 1), ('fall final', 1), ('fall midterm', 3), ('fall final', 3), ('fall final', 2), ('fall midterm', 4), ('fall final', 4)
Create table #TESTBATCH (TestBatchID int identity, TestID int, BATCHID int)
Insert into #testBatch (BATCHID, TestID)
values(1, 1), (1, 2), (2,1), (2,2), (3,6), (3, 7)
select * from #type
select * from #Batch
select * from #test
select * from #testBatch
這將顯示所有當前批次
select B.batchdate, t.TypeDescription, te.TestDescription, t2.TypeDescription
from #testBatch tb
join #batch b on b.batchid = tb.batchid
join #type t on t.typeid = b.typeid
join #test te on te.testid = tb.testid
join #type t2 on t2.typeid = te.typeid
這個細節將顯示當前所有的測試,即使沒有當前批
select te.TestDescription, t2.TypeDescription, B.batchdate, t.TypeDescription
from #test te
join #type t2 on t2.typeid = te.typeid
left join #testBAtch tb on te.testID = tb.testId
left join #batch b on b.batchid = tb.batchid
left join #type t on t.typeid = b.typeid
等等,我錯過了一些東西。如果'每個批次只包含一種類型的測試','一個測試結果屬於一個批次',那麼'A型測試的結果'應該如何在類型B的批次中進行? –
在現實世界中 - 它不能。每個結果都是針對特定的測試和特定的批次,並且該測試和該批次*必須*具有相同的類型。 在我的數據庫設計中 - 很容易得到A類測試的結果,但結果是B類的批次。這就是爲什麼我認爲我的設計被破壞的原因。 –