2014-01-12 35 views
2

我正在設計一個獎勵數據庫應用程序。它有75年的歷史和許多類別隨時間而變化。目前,我所考慮的設計有兩種表格:如何在mySQL中查詢很多表格

entities 
    people 
    publishers 
categories 
    novel 
    movie 
    author 
    artist 

等等。例如:每個類別都有該類別的數據,例如:

NOVEL 
title  varchar(1024) 
author  int  #FK into people table ID 
publisher int  #FK into publisher table ID 
year  year(4) 
winner  bool 

or 

ARTIST 
name int 
year year(4) 
winner bool 

到目前爲止好。然而,這些類別中有38個(!)隨着時間的推移已經存在(有些不再存在了),我真的無法想象從1963年開始,所有獲獎者都會這樣做:

SELECT * from table1,table2,...,table38 WHERE year=1963 and winner=TRUE; 

這些表格永遠不會那麼大(每個類別通常最多有五個被提名人​​,所以即使在一百年後,每張桌子最多也會有500行,並且對於不會延續的早期表格而言會少很多) 。所以這不是一個性能問題。只是因爲那個查詢對我來說感覺非常非常錯誤,因爲每當創建一個新類別或刪除一箇舊類別時,每個查詢都必須更改。每隔幾年左右發生一次。

的問題則是:

  • 是這個查詢的證據,我已經設計了這個錯了嗎?
  • 如果沒有,是否有更好的方法來做這個查詢?
  • 我一直在想,必須有一些方法來創建一個從其他表中拉出的查找表,但我可能會誤解。有沒有辦法做這樣的事情?

非常感謝,

格倫

回答

0

你可以用3個表格做到這一點。第一個是實體。它包含有關所有出版商/藝術家等的數據。

entities 

    name varchar(1024) 
    publisher bool 

其次是其中來自所有類別的所有數據被存儲數據

data 

title  varchar(1024) 
author/name  int  #FK into people table ID 
publisher int  #FK into publisher table ID 
year  year(4) 
winner  bool 
category int  #FK into category table ID 

三是類別中,你可以找到與自己ID的所有類別名稱。

category 

ID int 
name varchar(1024) 

現在你只需要加入三張表。

select * from entities e, data d, category c where d.name=e.name and d.category=c.id and winner=bool and year=1963 
+1

尼姆的關於slu is的觀點是一個有趣的想法,但我認爲蒂爾達撞上了頭。將所有表合併爲一個表的方法是讓數據表包含38個表中的字段的並集。如果我允許它們爲NULLable,那麼例如,最佳小說可能會將data.director字段設置爲空,但是對於數據。作者而言,反之亦然。 非常感謝! – gglazer

0

你最好到有類別中,你可以保存類別鍵值,或只是普通等級表,你可以保存該行的ID在其他表表: 例如,

表:類別

列:ID,姓名,蛞蝓,狀態,active_since,inactive_since等...

在slug中,您可以保持slugified形式的貓以方便查詢和url:例如,行業創新類別將被保存爲行業創新。

在狀態中,保持0或1以顯示它現在是否處於活動狀態。您也可以保留日期,當它處於活動狀態時,以及在active_since和inactive_since字段中變爲非活動狀態時。

當你搜索時,你可以搜索那些具有狀態1的例子等等。我不認爲你的問題是複雜的,並且當你連接表時,mysql非常簡單。

有幾十個表加入並且沒問題的項目。