Mysql

連接多個表以進行聚合或創建具有組合屬性的單個表

  • October 6, 2019

我有以下 ER 圖。

在此處輸入圖像描述

現在我可以選擇使用前面提到的單個表 ARTDATA,或者,我可以使用 13 個通過關係相互連結的不同表。

問題是對於每一種藝術,我都必須顯示所有屬性,即對於每一種藝術,我都必須獲取類型、作者、時間框架、形式、位置和學校。為此,我必須將所有這些表連接在一起,這可能需要時間。但是,我總是可以選擇單表 ARTDATA 並將所有內容放在一個地方。

鑑於我的數據集很大(50000 多個條目)並且將來會增長,最好的解決方案是什麼?

假設我要使用 13 個表,那麼合併所有表的最佳查詢是什麼?我將把我可憐的嘗試放在下面。

select 
t1.ID,
t1.TITLE,
t1.DATE,
t1.TECHNIQUE,
t1.URL,
t3.AUTHOR,
t3.BORN_DIED,
t5.FORM,
t7.LOCATION,
t9.SCHOOL,
t11.TIMEFRAME,
t13.TYPE

from
ART t1 inner join 

ART_AUTHOR t2 on t1.id=t2.art_id inner join 
AUTHOR t3 on t3.id=t2.author_id inner join

ART_FORM t4 on t1.id=t4.art_id inner join 
FORM t5 on t4.form_id=t5.id inner join 

ART_LOCATION t6 on t1.id=t6.art_id inner join 
LOCATION t7 on t6.location_id=t7.id inner join 

ART_SCHOOL t8 on t1.id=t8.art_id inner join 
SCHOOL t9 on t8.school_id=t9.id inner join 

ART_TIMEFRAME t10 on t1.id=t10.art_id inner join 
TIMEFRAME t11 on t10.timeframe_id=t11.id inner join 

ART_TYPE t12 on t1.id=t12.art_id inner join 
TYPE t13 on t12.type_id=t13.id; 

你明白了要點,那是野蠻的。

更新:

我已經更新了表格並使用上述查詢創建了一個名為 ARTDATA 的視圖。現在這裡是更新 ER。

UPDATED ER

您有 6 個多對多表將一個錶鍊接到 6 個其他表?

如果其中任何一個只是一對多,請折騰連結表。

標準化很好;過度標準化是不好的。

LOCATION如果它包含的唯一內容是列,為什麼還要有一個表LOCATION

多對多表有些低效。(請參閱此部分解決方案:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table)。

另一方面,50K 行是一個“小”表。它的大小可能為 50MB,應該很容易適合您的伺服器。

正規化適用於:

  • 隔離名稱,以便可以在一個位置更改它們(需要這樣做嗎?),或
  • 為了節省空間(見下文),或
  • 一起收集多個屬性(例如,AUTHOR

我想我反對節省空間的必要性。

在 的情況下AUTHOR,有多個列,因此有一個AUTHOR表是有意義的。

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