我正在开发一个Web应用程序,需要一些有关如何组织数据库信息的建议。以下是该应用程序将拥有的所有信息的列表:
1)将会有用户存储在如下表中:
User
- username (primary key)
- email
2)用户可以创建地图(由表格表示)
Map
- name
- data
用户可以创建许多地图
使用mySQL数据库,我应该如何实现如上所述的存储系统:
最后,我希望每个用户都可以访问并只查看自己的地图集合。 我是mySQL和数据库设计的新手,所以对此有任何建议。
答案 0 :(得分:1)
由于您提到用户可以创建许多地图,我认为您只需要两个表(每个用户的地图表不多)
用户强>
<强>地图
转换为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。