0

我正在制作一个互动节日节目,并决定将信息保存在数据库中以便于显示和搜索。每个节目可以用三种不同的语言呈现,它们可以有一个或多个演出时间,以及许多不同的艺术家。所以有很多东西会因节目而异,这就是为什么最好将一些信息放在他们自己的表格中。尤其是艺术家,因为同一位艺术家可能会出现在许多不同的节目中,并且每个节目的艺术家人数各不相同。

到目前为止,我有一个主表,其中包含节目标题、说明、演出时间、票价等。我希望艺术家有自己的表,并通过他们的 ID 引用艺术家并将它们作为 PHP 脚本附加到不同的节目循环通过主表。

  1. 如何从主表的另一个表中引用艺术家 ID?

  2. 从他们的表中获取艺术家的好查询是什么样的?

表格(初步计划):

主表

id | show title | show date | description | performers
------------------------------------------------------
1  | Beethoven  | 13.4.2013 | A classic   | 1,35,22,3
2  | Mozart     | 14.4.2013 | Fantastic   | 9,4,66

etc..

艺术家表

id | name  | instrument |
-------------------------
1  | Steve | Violin     |
2  | Alex  | Piano      |

etc...

“表演者”列中的数字将对应于艺术家表中的 ID。不过,不确定这是引用它们的正确方法。然后 PHP 脚本将两者结合起来并输出一个完整的节目项目。

任何帮助表示赞赏。

4

3 回答 3

0

以下是我将如何设置数据模式:

CREATE TABLE `artists` (
  `artist_id` int(10) unsigned NOT NULL auto_increment,
  `artist_name` varchar(100) NOT NULL default '',
  `instrument` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`artist_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `Shows` (
  `show_id` int(11) NOT NULL auto_increment,
  `show_title` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `language` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`show_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_times` (
  `show_time_id` int(10) unsigned NOT NULL auto_increment,
  `show_id` int(10) unsigned NOT NULL default '0',
  `show_date` date NOT NULL default '0000-00-00',
  `show_time` time NOT NULL default '00:00:00',
  PRIMARY KEY  (`show_time_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_time_artist_lookup` (
  `show_time_id` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`show_time_id`,`artist_id`)
) TYPE=MyISAM;

这将允许您在不同的日期/时间使用相同的演出信息。然后艺术家将被绑定到使用查找表显示时间。

编辑:实际上对于语言,由于您有一小部分选项,您可以使用二进制数学并将一个很小的数字存储在单个字段中。例如:

1 = 英语 2 = 意大利语 4 = 德语

您可以存储 TinyINT 值(将架构更改为此)

`language` tinyint(2) NOT NULL default '1',

与三个值中的任何一个或组合。例如,如果节目以英语和意大利语提供,您将存储值 3。对于所有三种语言,它将是 7。然后,当您提取节目数据时,您可以使用任何编程语言进行二进制数学比较来解码它. 这是一个解释如何在 PHP 中执行此操作的页面:http ://www.litfuel.net/tutorials/bitwise.htm

于 2013-04-03T20:58:55.280 回答
0

假设您有一个show包含两列的表:show_id、name。其中 show_id 是主键。假设您有一个artist包含两列的表:artist_id、name。其中artist_id 是主键。

您需要的称为 m:n 关系,这意味着一个艺术家可以分配给多个节目,而一个节目可以有多个艺术家。为此,您需要创建一个新表来存储此关系。让我们show_artist用两列 show_id、artist_id 来命名它。两列都是 PRIMARY KEY。此表中的每一行将存储一位特定艺术家(由艺术家 ID 定义)和一场演出(由 show_id 定义)之间的一种关系

如果您知道 show_id,则可以使用以下查询获取该节目中的所有艺术家姓名:

SELECT name FROM show_artist JOIN artist USING (artist_id) WHERE show_id = [YOUR SHOW ID]
于 2013-04-03T21:00:12.823 回答
0

您进行查询的方式是使用通常称为“连接”表的方法。这是一个额外的表格,您可以在其中一列中列出节目 ID,在另一列中列出艺术家 ID。例如:

MainArtists 表

showid | artistid
-------------------
1      | 1
1      | 2
2      | 1

在这个连接表中,Steve 和 Alex 都在贝多芬表演中,但只有 Steve 在莫扎特表演中。

要取出它们,您可以在 mysql 中使用 join 命令:

SELECT * FROM Main
INNER JOIN MainArtists ON ShowArtists.showid = Main.id
INNER JOIN Artists ON Artists.id = MainArtists.artistid

此查询将为每个节目的每位艺术家提供一行。如果您只想要节目 #1 中的艺术家列表,您可以在末尾添加“WHERE main.id = 1”,依此类推。

最好将 Main 和 Artists 中的 id 列分配为主键,并将 MainArtists 中的 showid 和 Artistid 列分配为链接回各自表的外键。互联网上有很多关于连接和外键/主键关系的资源,因此搜索这些术语应该会对您有所帮助。

于 2013-04-03T21:01:16.840 回答