C# 每个用户的数据库?或者同一数据库中的每一个

C# 每个用户的数据库?或者同一数据库中的每一个,c#,mysql,.net,C#,Mysql,.net,我正在用C语言用.net构建一个webApp,允许用户打开一些项目,在每个项目中,他们都有数据,包括MYSQL中地图和地图上项目的表。每个人都有相同的桌子。 我想知道如何在两个选项之间构建sql结构: 1每一个注册到该网站的人都将获得一个新的数据库。 2每个人都将获得一个唯一的ID,表中的每个项目都将有更多列用于此ID,我将根据ID仅选择此项目 什么会更有效 一个数据库。唯一ID。几乎每个存储过程或SQL语句中都会有WHERE UniqueID=。正如其他回答者已经提到的,为每个用户创建数据库是

我正在用C语言用.net构建一个webApp,允许用户打开一些项目,在每个项目中,他们都有数据,包括MYSQL中地图和地图上项目的表。每个人都有相同的桌子。 我想知道如何在两个选项之间构建sql结构: 1每一个注册到该网站的人都将获得一个新的数据库。 2每个人都将获得一个唯一的ID,表中的每个项目都将有更多列用于此ID,我将根据ID仅选择此项目


什么会更有效

一个数据库。唯一ID。几乎每个存储过程或SQL语句中都会有WHERE UniqueID=。

正如其他回答者已经提到的,为每个用户创建数据库是很少见的。但是,将用户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;
上述设计将帮助您编写与应用程序相关的简单查询。使用上述索引的所有查询也会很快

此外,对于潜在的功能添加,它将足够灵活。例如,如果其他用户有可能参与另一个用户的映射,则可以将权限/角色列添加到用户\u has\u映射表中,并通过正确设置该列来添加新行

可以改进上面定义的外键,以确保数据完整性,使数据库中的数据语义正确。您可以设置ON DELETE和ON UPDATE触发器,以简化从数据库中删除地图或用户时的清理。您可以通过以下链接了解有关外键的更多信息:


为特定实体的任何实例创建数据库似乎不必要地麻烦,当然也不常见。除非有一个很好的理由使用您没有提到的选项1,否则选项2似乎是一个明确的选择。选项2唯一关心的是数据库大小和性能。但这通常可以通过投入更多的硬件和巧妙的索引来克服。然而,这并不能保证。