c# - 每个用户的数据库?或同一数据库中的每个

标签 c# mysql .net

我正在 C# 中使用 .net 构建一个 webApp,它允许用户打开一些项目,并且在每个项目中,他们的数据都包括 MYSQL 中的 map 和表格,用于 map 上的项目。 (每个人都有相同的 table )。 我想知道我应该如何在两个选项之间构建 sql 结构: 1) 每个在该网站注册的人都会获得一个新的数据库。 2)每个人都会获得一个唯一的ID,表中的每个项目都会有更多的列用于该ID,我将通过ID仅选择该项目。

什么会更有效?

最佳答案

正如其他回答者已经提到的那样,为每个用户创建一个数据库是很不常见的。但是直接将 user_id 添加到每一列可能也不是一个好主意。

理想情况下,您应该正确设计不同数据(您的情况下的用户、 map 、项目)之间的关系,并使用正确的索引/键来拥有灵活高效的架构。

示例设计可以是:

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;

上面的设计将帮助您编写与您的应用程序相关的简单查询。使用上面索引的所有查询也会很快。

此外,它将足够灵活,可以添加潜在的功能。例如,如果其他用户可以为另一个用户的 map 做出贡献,您可以向 user_has_map 表添加权限/角色列,并通过正确设置此列来添加新行。

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

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

Basics of Foreign Keys in MySQL?

关于c# - 每个用户的数据库?或同一数据库中的每个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19751823/

相关文章:

c# - Azure AD 应用程序 - 需要角色分配 + 为应用程序添加角色分配?

php - 选择过去 7 天的前 3 名总和

c# - 为什么使用 contextmenustrip 右键单击​​第一秒菜单不在鼠标位置?

c# - MSBuild 自定义规则

c# - Caliburn Micro 在 ListView 的 ContextMenu 中找不到 DataContext

c# - 当用户点击asp.net中的外部面板时如何获取警报消息

php - 如何在mysql 5存储过程中检查查询结果是否为空?

c# - 使用 Linq-to-SQL 同时向不同表插入数据

c# - 如何使用 CreateObjectSet<TEntity> 将 TEntity 作为参数?

php - 无效几何 MYSQL