2017-03-17 39 views
-1

我有這個項目記錄學生的犯罪。在DBMS中追加好嗎?

這是怎麼回事。

想象一個班的女孩犯了作弊行爲。她的數據然後被添加到表格中。然後,同一個女孩又犯了另一種罪行 - 破壞行爲。她的信息再次存儲在數據庫中。所以它會在表格中看起來像這樣。 (完成於同日)

Record Number Student_ID  Name  OffenseCode OffenseDesc 
     1   178003   Girly   N   Cheating 
     2   178003   Girly   B   Vandalism 

然後我有有在少女的條目

RecordNumber OffenseNumber Student_ID OffenseCode Count Remarks 
     1    1   178003   N  0 WARNING 
     2    2   178003   B  1 CALL PARENT 

以下數據我橋樑實體然後在DataGridView時(使用VB.NET)發生這種情況

Record Number Student_ID  Name  OffenseCode OffenseDesc 
     1   178003   Girly   N   Cheating 
     2   178003   Girly   B   Vandalism 
     3   178003   Girly   N   Cheating 
     4   178003   Girly   B   Vandalism 

我INNER JOINED我的表得到的結果。如果你必須知道表

學生 - Record_Number(PK),student_id數據,姓名,班級,DateCommitted
橋 - Record_Number(PK),OffenseNum(PK),student_id數據,Offense_Code,計數,備註
罪行 - OffenseNum (PK),OffenseCode,OffenseDesc

我該如何解決上述問題?

+0

所以,'StudentId'是*不*的PK的學生嗎?它的目的是什麼?什麼是第一個表,它似乎複製了「橋」表中的所有內容 – Plutonix

+0

@Plutonix因爲當我將它設置爲PK並且我想將相同的數據插入到數據庫中時,它只會創建一個錯誤,表明數據已經存在。所以我創造了記錄號碼作爲PK,使它起到日誌式樣記錄的作用。 – NoobCoder

+0

@NoobCoder這很好,但它不再是你的學生表。如果學生更改他們的名字或班級,則必須更新該學生表格中的每條記錄。 –

回答

2

這是你的表結構應該是什麼樣子:

  1. 學生 — StudentID(PK),StudentName,類
  2. OffenseType — OffenseCode(PK),OffenseDesc
  3. 事件 — Record_Number(PK),StudentID,OffenseCode,DateCommitted,備註

您甚至可能需要額外的備註表,因爲有些人可能需要在事件完全解決之前對事件發表評論。

然後爲網格的查詢將是這樣的:

SELECT RecordNumber, StudentID, StudentName, OffenseCode, OffenseDesc 
FROM Incident i 
INNER JOIN OffenseType o ON o.OffenseCode = i.OffenseCode 
INNER JOIN Student s on s.StudentID = i.StudentID 
+0

但是,** Student **和** OffenseType **之間的表格是M:N關係。這意味着我需要兩個表之間的橋/合成實體來解決這種關係。 在這種情況下,輸出是什麼?學生少女將被兩次展示兩次不同的罪行? – NoobCoder

+0

在這種情況下,「事件」表**是您正在討論的那個相交(橋/複合)鏈接。交叉路口或橋接線路幾乎總是成爲一個實體。根據我提出的表格模式和查詢,一名名爲「Girly」的學生有兩次犯罪,會出現兩次(每次犯罪一次),但不是她在問題樣本中的四次。 –

+0

我明白了。我注意到你沒有包含Count屬性,因爲它只會搞亂桌子,對吧? – NoobCoder