我正在用 C# 中的 .net 构建一个 webApp,它允许用户打开一些项目,并且在每个项目中,他们的数据都包括 MYSQL 中用于地图上项目的地图和表格。(每个人都有相同的桌子)。我想知道我应该如何在 2 个选项之间构建 sql 结构:1)每个注册到该站点的人都会自己获得一个新数据库。2)每个人都将获得一个唯一的 ID,并且表中的每个项目都会有更多的列用于该 ID,并且我将仅通过 ID 选择这些项目。
什么会更有效?
正如其他回答者已经提到的那样,为每个用户创建一个数据库是非常罕见的。但是直接将 user_id 添加到每一列也可能不是一个好主意。
理想情况下,您应该正确设计不同数据(您的案例中的用户、地图、项目)之间的关系,并使用正确的索引/键来拥有灵活高效的模式。
示例设计可以是:
CREATE TABLE user (
int id NOT NULL,
.... // user data fields will come here...
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE map (
int id NOT NULL,
.... // map data fields will come here...
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE item (
int id NOT NULL,
.... // item data fields will come here...
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE map_has_item (
int map_id NOT NULL,
int item_id NOT NULL,
PRIMARY KEY (map_id, item_id),
FOREIGN KEY (map_id) REFERENCES map (id),
FOREIGN KEY (item_id) REFERENCES item (id)
) ENGINE = InnoDB;
CREATE TABLE user_has_map (
int user_id NOT NULL,
int map_id NOT NULL,
PRIMARY KEY (user_id, map_id),
FOREIGN KEY (user_id) REFERENCES user (id),
FOREIGN KEY (map_id) REFERENCES map (id)
) ENGINE = InnoDB;
上面的设计将帮助您编写与您的应用程序相关的简单查询。所有使用上述索引的查询也会很快。
此外,它对于潜在的功能添加将足够灵活。例如,如果其他用户可以为另一个用户的地图做出贡献,您可以向 user_has_map 表添加权限/角色列,并通过正确设置此列来添加新行。
可以改进上面定义的外键以确保数据完整性(在数据库上具有语义正确的数据)。您可以设置 ON DELETE 和 ON UPDATE 触发器来简化从数据库中删除地图或用户时的清理工作。您可以通过以下链接了解有关外键的更多信息:
http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
一个数据库。唯一 ID。几乎每个存储过程或 SQL 语句都将包含“WHERE UniqueID =”。