Mysql

有效地為擴展類建模

  • December 18, 2013

我有 3 種不同類型的網站內容,“文章”、“影片”、“評論”。這三種類型的內容中的每一種都包含公共欄位和特定類型的欄位。為此,我創建了以下 5 個表:

content - being the primary table containing the common fields across all content types
content_type - name, description, and type specific table name of available content types
article - the table that contains all the type specific fields for content of type 'Article'
video - the table that contains all the type specific fields for content of type 'Video'
review - the table that contains all the type specific fields for content of type 'Review'

對於正確創建表之間的關係,我有點困惑。實際上,一個“內容”行與一個“文章”(類型特定表)行相關​​。對我來說,這聽起來像是一對一的非辨識關係。我認為我最困惑的地方是類型可以是眾多類型之一。那麼它們應該是一對多還是多對多,辨識/非辨識?

我需要能夠搜尋內容欄位,然後根據搜尋檢索相應類型的特定行。我還需要能夠搜尋特定類型的欄位,並檢索搜尋匹配的相應內容行。

還要注意的是,我正在使用帶有 Doctrine/ORM 的 MySQL,但是我不是在這裡尋找 SQL 語句,我只是想更好地理解關係實際上應該是什麼樣子。

您有超類型(內容),它可能是不同的超類型(文章、影片、評論)之一。在數據庫中對這種關係建模的一種方法是:

CONTENT(content_id, content_type_id, PK(content_id), UNIQUE(content_type_id,content_id));

ARTICLE(content_id, content_type_id, 
 other attributes, 
 PK(content_type_id,content_id), 
 FK(content_type_id,content_id), CHECK (content_type_id = 'article_type_id'));

VIDEO(content_id, content_type_id, 
 other attributes, 
 PK(content_type_id,content_id), 
 FK(content_type_id,content_id), CHECK (content_type_id = 'video_type_id'));

等等。

UNIQUE(content_type_id,content_id)似乎是多餘的,但它用於強制將子類型儲存在適當的表中,並且只儲存一次。CHECK 約束限制每個詳細資訊表中的正確內容類型。據我記得,Mysql 仍然沒有唯一的 CHECK約束,但您可以使用enum它們來模擬它們。

引用自:https://dba.stackexchange.com/questions/55252