0

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

1)将有用户存储在这样的表中:

User
 - username (primary key)
 - email

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

Map
 - name
 - data

用户可以创建许多地图

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

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

最后,我希望每个用户只能访问和查看自己的地图集合。我是 mySQL 和数据库设计的新手,因此不胜感激。

4

3 回答 3

1

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

用户

  • 用户 ID(主键
  • 用户名(唯一
  • 电子邮件

地图

  • ID(主键
  • 姓名
  • 日期
  • 用户 ID(外键

翻译成 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

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-03-09T17:16:37.727 回答
1

不要为地图的每个用户创建一个新表。维持这将是一场噩梦,并且您将失去对标准化的控制。类似的评论适用于第 3 点(maps每个用户地图的新列)。

做你的第一点:在maps上添加一个用户名列。然后,您可以为地图创建一个表格,并根据需要为每个用户创建任意数量的地图。我会更进一步,添加一个auto_increment链接到地图的“用户 ID”列(用户名毕竟可能会改变——并且应该仍然是唯一的)。地图也应该有自己的auto_increment标识符列。这称为“代理键”。

SELECT data FROM Map JOIN User USING(userID) WHERE userID = ?
于 2013-03-09T17:17:08.303 回答
0

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

然后您在谈论用户之间的关系地图,因此您可以将该表称为 UserMapRelationship 或简称为 UsersMap

这将保存两个表的 pk 以及可能与该关系相关的信息。

希望这有帮助。

谢谢!

@leo。

于 2013-03-09T17:19:04.750 回答