Mysql
連接多個表以進行聚合或創建具有組合屬性的單個表
我有以下 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。
您有 6 個多對多表將一個錶鍊接到 6 個其他表?
如果其中任何一個只是一對多,請折騰連結表。
標準化很好;過度標準化是不好的。
LOCATION
如果它包含的唯一內容是列,為什麼還要有一個表LOCATION
?多對多表有些低效。(請參閱此部分解決方案:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table)。
另一方面,50K 行是一個“小”表。它的大小可能為 50MB,應該很容易適合您的伺服器。
正規化適用於:
- 隔離名稱,以便可以在一個位置更改它們(需要這樣做嗎?),或
- 為了節省空間(見下文),或
- 一起收集多個屬性(例如,
AUTHOR
)我想我反對節省空間的必要性。
在 的情況下
AUTHOR
,有多個列,因此有一個AUTHOR
表是有意義的。