我该如何在MySQL中安排多个表

时间:2013-03-09 17:13:43

标签: mysql sql

我正在开发一个Web应用程序,需要一些有关如何组织数据库信息的建议。以下是该应用程序将拥有的所有信息的列表:

1)将会有用户存储在如下表中:

User
 - username (primary key)
 - email

2)用户可以创建地图(由表格表示)

Map
 - name
 - data

用户可以创建许多地图

使用mySQL数据库,我应该如何实现如上所述的存储系统:

  • 我应该有一个表存储所有用户的地图吗?然后在Map表中创建一个新的'username'字段。
  • 我应该为每个只存储该用户地图的新用户创建一个新的地图表。
  • 我应该在用户中创建一个新的'maps'字段,然后将其链接到Map表吗?

最后,我希望每个用户都可以访问并只查看自己的地图集合。 我是mySQL和数据库设计的新手,所以对此有任何建议。

3 个答案:

答案 0 :(得分:1)

由于您提到用户可以创建许多地图,我认为您只需要两个表(每个用户的地图表不多

用户

  • userID(主键
  • userName( unique
  • 电子邮件

<强>地图

  • ID(主键
  • 名称
  • 日期
  • userID(外键

转换为DDL时:

CREATE TABLE User
(
    UserID INT AUTO_INCREMENT,
    UserName VARCHAR(15),
    Email VARCHAR(35),
    CONSTRAINT usr_pk PRIMARY KEY(UserID),
    CONSTRAINT usr_uq UNIQUE(UserName)
);

CREATE TABLE Maps
(
    MapID INT AUTO_INCREMENT,
    Name VARCHAR(20),
    Date DATETIME,
    UserID INT,
    CONSTRAINT map_pk PRIMARY KEY(MapID),
    CONSTRAINT map_FK FOREIGN KEY(UserID) REFERENCES User(UserID)
);

如果您想获取所有用户的所有地图,

SELECT  a.*, b.Name
FROM    User a
        INNER JOIN Maps b
            ON a.UserID = b.UserID

要进一步了解联接,请访问以下链接:

答案 1 :(得分:1)

不要为地图的每个用户创建一个新表。这将是一个难以维持的噩梦,你将失去对规范化的控制。类似的评论适用于第3点(每个用户地图的新maps列)。

请注意第一点:在地图上添加用户名栏。然后,您可以拥有一个地图表,并根据需要为每个用户创建尽可能多的地图。我会更进一步,添加一个auto_increment“用户ID”列链接到地图(用户名可能会改变 - 并且应该仍然是唯一的)。 Map也应该有自己的auto_increment标识符列。这被称为“代理键”。

SELECT data FROM Map JOIN User USING(userID) WHERE userID = ?

答案 2 :(得分:0)

我得到的最好的数据库设计之一是为每个名词创建一个表(和单数)。例如,你在谈论用户。这意味着您将拥有用户表。然后你有一个Map Table来列出所有创建的地图。

然后你在谈论用户与地图之间的关系,所以你可以调用那个表UserMapRelationship或者只是用户地图

这个将保存两个表的pk,并且可能包含与该关系相关的信息。

希望这有所帮助。

谢谢!

@leo。