當你有什麼被稱爲「多對多」的關係(很多事件可以有多個標籤),你需要一箇中間表處理分配 - 這稱爲規範化。
在這種情況下,你需要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
你需要分配一箇中間表litterally發生事件的ID和標籤的ID。表將是3列 - tableid,eventid,tagid – Takarii
@Takarii Yeh,這就是我所假設的那樣,但沒有tableid字段,而是一個字段來說如果標籤被分配爲主標籤或輔助謝謝。但是,請您介紹關於如何將字段分配爲外鍵而不使其唯一或唯一的第二點。 –
將所有標籤放在同一個表中,然後將它們標記爲主要或次要標籤。處理數據庫外部代碼中每個事件的1個主標記的限制 – Takarii