需要数据库效率建议

时间:2015-07-18 04:46:04

标签: sql database

我有以下数据库表。我试图找出一种方法,我可以构建这个,这样我就可以为每个玩家列提供一个位置。因为每个用户将拥有多个玩家并且将有多个用户,所以我无法找到建模我的数据库表以提高效率的最佳方法。

CREATE TABLE `user_players` (

 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `firstname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `lastname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player3` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player4` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player5` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
 `player6` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

我能想到的唯一一件事就是为玩家添加一个player_position,这样看起来就像这样......

`player1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`player_position1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`player2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`player_position2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

有更好,更有效的方法吗?

2 个答案:

答案 0 :(得分:3)

您需要为用户和玩家分别使用表格。播放器表将拥有拥有它的用户的外键。

答案 1 :(得分:1)

如果你想设计高效的数据库,那么我建议你先了解一些关于规范化的知识。

要了解规范化的基础知识,请参阅:

显然,您的数据库未规范化并需要规范化。

问题1: 通过分配Primary Key来实现第一个规范化表单。

问题2: 您的数据库包含Transitive Dependency (如果您将id视为主键,则为传递依赖项。此后,player字段将取决于非关键属性。即user_id

  • 通过为用户和播放器创建不同的表来修复它。
  • 另请参阅Foreign Key
  • 的概念

如果您解决了这两个问题,那么您将不再需要同时使用iduser_id。你可以放弃其中一个。

最终数据库架构:

CREATE TABLE `user` (
    `user_id`   int(11) NOT NULL PRIMARY KEY, /*Make it AUTO_INCREMENT if you wish to*/
    `firstname` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `lastname`  varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `username`  varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `email`     varchar(100) COLLATE utf8_unicode_ci NOT NULL
)

CREATE TABLE `player` (
    `player_id` int(11) NOT NULL PRIMARY KEY, /*Make it AUTO_INCREMENT if you wish to*/
    `player1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `player2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `player3` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `player4` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `player5` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    `player6` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
    FOREIGN KEY (user_id) REFERENCES user(user_id)
)

P.S。:语法可能因您使用的数据库类型而异。