我正在为奖项设计数据库应用程序。它有75年的历史和许多类别随着时间的推移而发生变化。现在,我想到的设计有两种表格:
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;
这些表格永远不会那么大(每个类别通常最多有五个被提名者,所以即使在100年之后,每个表格最多会有500行,而对于那些不能继续使用的表格,则会少得多)。所以这不是性能问题。只是因为查询对我来说非常非常错误,只是因为每次创建新类别或删除旧类别时都必须更改每个查询。这种情况每隔几年发生一次。
问题是:
非常感谢,
格伦
答案 0 :(得分:0)
你最好有一个类别表,你可以保存类别键值,或者只是普通的类别表,你可以只在其他表中保存行的id: 例如,
表:类别
列:id,name,slug,status,active_since,inactive_since等......
在slug中,您可以保持猫的形式,以便于查询和网址:例如,行业创新类别将被保存为行业创新。
在状态中,保持0或1以显示它现在是否处于活动状态。您还可以在活动时以及在active_since和inactive_since字段中变为非活动状态时保留日期。
当你搜索时,你可以搜索那些状态为1的例子等。我不认为你的问题很复杂,当你连接表时,mysql很容易搜索。
有些项目加入了数十个表,没关系。
答案 1 :(得分: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
第三个是 category ,您可以在其中找到所有类别名称及其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