我有一個影像庫,我希望用戶能夠根據某些主題從 MySQL 資料庫中的現有影像創建板。例如,他們可以創建一個名為“London”的板,并將圖書館中已經存在的倫敦照片添加到該板上。
在板表中,我最初無法弄清楚如何為每個板存盤影像(有效地作為一個陣列),但是在閱讀了其他一些答案之后,似乎最好的方法是創建一個額外的表以及boards桌子?
目前有一些表格涵蓋images和users(簡化如下):
用戶表
- id -- username -- -
| 36 | Ted |
| 37 | James |
影像表
- id ---- filename ------- - file_extension - -
| 1038 | bigben | jpeg |
| 1039 | toweroflondon | jpeg |
所以,如果我理解這一點,我首先必須創建一個板表,如下所示
板表
- id - board_name - -
| 1 | London |
| 2 | Trees |
...然后是一個由純外鍵組成的附加表:表中的 and和id我的影像表中的 and 以及設定板的人的表,即用戶表中的。board_nameboardsimage_filenamefile_extensionuser_idid
images_boards 表
- board_id - board_name - - image_filename - - file_extension - - user_id - -
| 1 | London | bigben | jpeg | 36 |
| 1 | London | toweroflondon | jpeg | 36 |
我在概念上很難理解這一點,擁有一個由純外鍵組成的表感覺很奇怪,盡管在這種用例中這很可能是完全可以接受/首選的解決方案。
因此,我的問題是 - 我正確地接近這個嗎?
uj5u.com熱心網友回復:
當您在將這兩者映射在一起的表中具有board_idandboard_name時,不要同時在任何其他表中同時具有board_idand 。board_name相反,僅board_id在其他表中使用。
同時,該boards表將具有board_id和board_name(每個索引),以及有關“板”的任何屬性。
images_boards會有一個board_idand image_id; 沒有其他要求。并且在這個多對多表上有兩個索引: PRIMARY KEY(board_id, image_id)和INDEX(image_id, board_id). 該表不需要單獨的“id”。
您還提到user_id——它與董事會有關嗎?還是與影像?或者它真的是協會的另一個維度?如果是后者,那么將其作為第三列是可以的(盡管不尋常)。
uj5u.com熱心網友回復:
一個板可以包含多個影像,一個影像可以添加到多個板上。這是資料模型中“多對多”關系的典型示例。
所以你的方法很好,但正如保羅在他的評論中所寫的那樣,你不必將表格的內容復制到images表格中image_boards。您只需要其中的一image_id列。
這些鍵僅用于存盤所有這些物體之間的關系。然后,您的查詢將連接相關表以從每個物體中檢索所需的附加資訊。
此外,如果您user_id輸入此表,這應該意味著用戶創建的板可以填充其他用戶的影像。如果不是這種情況,則該user_id列應僅在boards表中。在每個板/影像關系中重復它是沒有用的。
最后,您必須為images_boards表的行設定主鍵。通常有兩種方法:
- 您可以創建一個新的自動遞增列,該列將作為此關系的 id(例如
images_boards_id)。 - 或者,您可以使用現有列來組成可用作主鍵的唯一組合。在您的情況下,如果不能在同一個板上多次添加影像,則 和 的組合
board_id可image_id用于組成主鍵。
uj5u.com熱心網友回復:
在構建關系資料庫時,通常最好遵循某種程度的規范化。這使得添加更多表格和重組表格變得更加容易。在 Wikipedia 中閱讀有關不同規范化級別的更多資訊,例如:https ://en.wikipedia.org/wiki/Database_normalization
所以在這種情況下,您只需要 images_boards 表中的外鍵。
然后,您只需在要獲取資料時加入表。如果 images_boards 具有以下列,則獲取一個板的資料的示例:board_id、image_id 和 user_id。
SELECT boards.id AS board_id, board_name, images.id AS image_id, image_filename, file_extension, users.id AS user_id, username
FROM your_schema.images_boards
INNER JOIN your_schema.images ON (images_boards.image_id = images.id)
INNER JOIN your_schema.boards ON (images_boards.board_id = boards.id)
INNER JOIN your_schema.users ON (images_boards.user_id = users.id)
WHERE board_id = x
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439347.html
