2017-01-20 76 views
0

我正在創建一個網站供青年組織使用,通過爲將要上市的活動提供場所來組織活動,並由成員註冊。在我的數據庫中,我有一張表格,裏面裝滿了可以分配給事件的標籤,非常像本網站,您可以在其中標記問題。我有另一個表來存儲有關事件的信息,例如標題,說明,要求,日期等。有關phpMyAdmin表格關係和數據庫結構的問題

我想連接這些數據庫,以便在事件發生時爲它們分配一個主標記,來自標籤表格中的次級標籤無限量。目前,我有一個鏈接表,它有一個用於事件ID,標籤ID以及標籤是否是主要標籤的字段,但是由於我必須將字段設置爲唯一的以允許我創建一個關係,所以我不能存儲輸入多個事件或標籤ID。

我的問題是,我爲上述功能構建數據庫的最佳方式是什麼?此外,如果我正確地做的是正確的,那麼我怎樣才能鏈接表中沒有任何領域的連接表是一個主鍵或唯一鍵?

tblEvents enter image description here

tblTags enter image description here

+0

你需要分配一箇中間表litterally發生事件的ID和標籤的ID。表將是3列 - tableid,eventid,tagid – Takarii

+0

@Takarii Yeh,這就是我所假設的那樣,但沒有tableid字段,而是一個字段來說如果標籤被分配爲主標籤或輔助謝謝。但是,請您介紹關於如何將字段分配爲外鍵而不使其唯一或唯一的第二點。 –

+0

將所有標籤放在同一個表中,然後將它們標記爲主要或次要標籤。處理數據庫外部代碼中每個事件的1個主標記的限制 – Takarii

回答

2

當你有什麼被稱爲「多對多」的關係(很多事件可以有多個標籤),你需要一箇中間表處理分配 - 這稱爲規範化。

在這種情況下,你需要3列:AssignmentID,事件ID,標籤識別

把所有的標籤在同一個數據庫表中,但旗每一個作爲主要或次要和內處理每個事件的1個主要標籤你的代碼在數據庫之外。

例如你的標籤表可能看起來像:

ETagID ETagName ETagColour ETagPrimary ETagDel 
1  first  red   1   0 
2  second blue  0   0 
3  third  green  0   0 
4  forth  yellow  1   0 
5  fifth  orange  0   0 
6  sixth  white  0   0 

和您的分配表:

AssignmentID EventID TagID 
1    1  1  
2    1  2 
3    1  5 
4    2  4 
5    3  4 
6    3  1 
7    4  4 

由於SQL外部的代碼處理擺在首位的插入,你現在可以使用連接查詢您的表格以便爲該事件提取事件+標記

SELECT ETagName, ETagColour FROM TagTable 
JOIN AssignmentTable on AssignmentTable.TagID = TagTable.ETagID 
JOIN EventTable on EventTable.EID = AssignmentTable.EventID 
WHERE EventTable.EID = <some value> AND TagTable.ETagDel = 1 

This wo uld選擇未刪除的特定事件的所有標記名稱和顏色。

重要的是要注意的不是過分複雜的事情。如果您的主標籤和輔助標籤除了存儲主要或次要標籤外,還存儲相同的信息,則其無意義將它們分隔爲單獨的表格。像我提到的那樣標記它們就足夠了,並減少了所需的表格數量。

希望這點你在正確的方向向前移動

更新:

按照最近的評論,你可以處理分配表中的主要標籤的分配。創建同一張桌子上面,而且還包括一次標誌柱太

AssignmentID EventID TagID PrimaryFlag 
1    1  1  1 
2    1  2  0 
3    1  5  0 
4    2  4  1 
5    3  4  1 
6    3  1  0 
7    4  4  1 

然後在查詢中,您也可以選擇使用一個略加修改的版本標籤的前寫的狀態:

SELECT ETagName, ETagColour, AssignmentTable.PrimaryFlag FROM TagTable 
JOIN AssignmentTable on AssignmentTable.TagID = TagTable.ETagID 
JOIN EventTable on EventTable.EID = AssignmentTable.EventID 
WHERE EventTable.EID = <some value> AND TagTable.ETagDel = 1 

如果你想確保主要的標籤出現在該列表的頂部,還可以在螺栓

ORDER BY AssignmentTable.PrimaryFlag 
+0

我試圖修改SQL以收集關於該事件的所有信息以及有關它的主要信息標籤,像這樣'SELECT EID,ETitle,EDesc,EREQ,EStartD,EEndD,ESUDeadline,EMaleS,EMaleTS,EFemaleS,EFemaleTS,tblTags.ETagColour FROM tblEvents JOIN上tblTagLink.ETagID = tblTags.ETagID tblTagLink JOIN上tblEvents tblEvents。 EID = tblTagLink.EventID WHERE tblEvents.EID = 1 AND tblTagsLink.ETagPrime = 1'。然而,我得到錯誤'#1066 - 不是唯一的表/別名:'tblEvents''。任何暗示?謝謝你的幫助。 –

+0

@ThomasSmyth你正試圖加入一張不需要的表格。您正在從tblEvents中進行選擇,因此您不需要加入 – Takarii

+0

我希望收集該事件的信息以及該事件的主標籤的信息。當然,我必須加入表格來引用tblTags來獲取主標籤的數據嗎?再次感謝你的幫助。 –