如何创建按标签组织的数据库

时间:2014-11-14 23:22:11

标签: mysql database tags

我会创建一个数据库,其内容按标签组织。

我创建了两个表,一个名为“游戏”和其他“平台”,并在表“游戏”中创建了一个名为“plataforma_id”的列,以便能够调用特定平台,但有些游戏有多个平台,所以我知道如何在我的“游戏”表中调用两个或更多平台。

例如:

桌上游戏

id | platform_id |名字

1 | 1 |的Game1

2 | 2 |的Game1

*我想为game1调用多个平台

表格平台

id |名称

1 | PC

2 | MAC

3 | Linux的

2 个答案:

答案 0 :(得分:1)

你想要的是A和B之间的多对多关系。这是通过第三个表A_B完成的,其中ID列来自A和B

桌上游戏

id |名字1 | 1 | game1 2 | 2 |的Game1

表格平台

id |名字1 | PC 2 | Mac 3 | Linux的

TABLE GAMES_PLATFORMS

id_game | id_platform

您需要JOIN用于select次查询

答案 1 :(得分:1)

Florent是正确的,你需要通过第三张桌子“多对多”的关系。任意数量的游戏都可以匹配任意数量的平台。使用JOIN将三个表与适当的关系链接在一起。

但是,我对您的架构有不同的想法:

CREATE TABLE IF NOT EXISTS `platforms` (
  `id` mediumint(8) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
);

CREATE TABLE IF NOT EXISTS `games` (
  `id` mediumint(8) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
);

CREATE TABLE IF NOT EXISTS `games_platforms` (
  `game_id` mediumint(9) NOT NULL,
  `platform_id` mediumint(9) NOT NULL,
  UNIQUE KEY `unique pair` (`game_id`,`platform_id`)
);

鉴于以下数据:

INSERT INTO `platforms` (`id`, `name`) VALUES
(1, 'Platform 1'),
(2, 'Platform 2'),
(3, 'Platform 3');

INSERT INTO `games` (`id`, `name`) VALUES
(1, 'Game 1'),
(2, 'Game 2'),
(3, 'Game 3');

INSERT INTO `games_platforms` (`game_id`, `platform_id`) VALUES
(1, 1),
(1, 2),
(2, 1);

以下查询:

SELECT g.`name` as `game_name`, p.`name` as `platform_name`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`);

我们得到以下结果:

GAME_NAME   PLATFORM_NAME
---------   -------------
Game 1      Platform 1
Game 1      Platform 2
Game 2      Platform 1
Game 3      (null)

WORKING EXAMPLE


以HTML格式显示:

为了将数据输出到HTML,请使用您正在使用的任何服务器端语言执行数据库查询(我在这些示例中使用PHP)并生成相应的HTML。选择您选择的HTML布局以显示数据(我正在使用表格)。

SQL处理:

对于较小的数据集,您可以在数据库查询中执行一些处理。例如,您可以显示concatenatecoalesce数据:

// fetch platforms by game

$sql="SELECT
    g.`name` as `game_name`,
    GROUP_CONCAT(
        COALESCE(p.`name`, 'n/a') ORDER BY p.`name` ASC SEPARATOR ', '
    ) as `platform_names`,
    COUNT(p.`id`) as `platform_count`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`)
GROUP BY g.`id`
ORDER BY g.`name` ASC;";

我创建了a few examples of database queries HERE

然后在PHP中输出结果数据集:

...

// list platforms by game

?><table border="1">
    <thead><tr><th>Game</th><th>Platforms</th></tr></thead>
    <tbody><?php

    while ($row=$q->fetch(PDO::FETCH_ASSOC)) {

        ?><tr>
            <td><?=$row['game_name']?></td>
            <td><?=$row['platform_names']?></td>
            <td><?=$row['platform_count']?></td>
        </tr><?php

    }

    ?></tbody>
</table><?php

...

看起来像这样:

Game        Platforms                             Platform Count
----        ---------                             --------------
Game 1      Platform 1, Platform 2, Platform 5    3
Game 2      Platform 1, Platform 3                2
Game 3      Platform 1, Platform 2, Platform 5    3
Game 4      Platform 2                            1
Game 5      n/a                                   0
Game 6      Platform 1, Platform 5                2

这是WORKING EXAMPLE

PHP处理:

在大型数据集上执行类似的查询可能太费时间了。或者,您可能需要比数据库查询本身更严格地处理结果。如果是这种情况,您可能希望使用PHP而不是数据库查询本身进行处理。

首先执行更通用的查询,如下所示:

// fetch platforms by game

$sql="SELECT g.`id` as `game_id`, g.`name` as `game_name`,
      p.`id` as `platform_id`, p.`name` as `platform_name`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`);";

WORKING EXAMPLE

然后将结果处理成一个数组:

while ($row=$q->fetch(PDO::FETCH_ASSOC)) {

    // add this row's game to the array
    $entries[$row['game_id']]['game']=array(
        'id'=>$row['game_id'],
        'name'=>$row['game_name']
    );

    // if there's a platform for this row, add it to the game entry
    if ($row['platform_id']) {
        $entries[$row['game_id']]['platforms'][]=array(
            'id'=>$row['platform_id'],
            'name'=>$row['platform_name']
        );
    }

}

然后将该数组输出到表中 (压痕有点扁平以节省空间):

?><table border="1">
<thead><tr><th>Game</th><th>Platforms</th><th>Platform Count</th></tr></thead>
<tbody><?php

foreach ($entries as $entry) {

    ?><tr>
    <td><a href="#view_game.php?id=<?=$entry['game']['id']?>"><?=$entry['game']['name']?></a></td>
    <td><?php

    if (empty($entry['platforms'])) {
        echo "n/a";
    } else {
        foreach ($entry['platforms'] as $platform) {
            ?><p><a href="#view_platform.php?id=<?=$platform['id']?>"><?=$platform['name']?></a></p><?php
        }
    }

    ?></td>
    <td><?=!empty($entry['platforms'])?count($entry['platforms']):0?></td>
    </tr><?php

}

?></tbody>
</table><?php

通过这种方式,您可以生成一个可能更强大的数据表,包含潜在的链接到游戏和平台以及其他功能。像这样:

Game        Platforms      Platform Count
----        ---------      --------------
Game 1      Platform 1     3
            Platform 2
            Platform 5

Game 2      Platform 1     2
            Platform 3

Game 3      Platform 1     3
            Platform 4
            Platform 5

Game 4      Platform 2     1

Game 5      n/a            0

Game 6      Platform 1     2
            Platform 5

这是WORKING EXAMPLE

这些只是您可以对数据集做些什么的一些想法和头脑风暴。数据库允许一些非常有趣的数据操作,可能性似乎无穷无尽。