SQLite:每个用户单独的表还是为所有用户提供一张表?

Pav*_*dhu 2 database sqlite

我已经设计了一个使用 SQLite 数据库的网站。我没有使用一张大表,而是将其设计为当用户注册时,会为他们创建一个单独的表。每个用户可能会使用数百条记录。我这样做是因为我认为这样会更容易构建和访问。

我在该网站上的其他问题中发现,一张表比为每个用户使用多个表更好。

是否值得重新设计我的网站,以便不再有许多桌子,而是一张大桌子?我当前的方法似乎运行良好,尽管它仍在开发中,所以我不确定它在真实环境中的效果如何。

问题是:在性能、效率、组织和空间方面,更改代码以形成一个大型数据库而不是许多单独的数据库是否值得?

SQLite:创建用户表。

CREATE TABLE " + name + " (id INTEGER PRIMARY KEY, subject TEXT, topic TEXT, questionNumber INTEGER, question TEXT, answer TEXT, color TEXT)
Run Code Online (Sandbox Code Playgroud)

SQLite:将帐户添加到帐户表中。

"INSERT INTO accounts (name, email, password, activated) VALUES (?,?,?,?)", (name, email, password, activated,)
Run Code Online (Sandbox Code Playgroud)

请注意,如果有什么区别的话,我将 python 与 Flask 一起使用。


编辑

我也知道已经存在这样的问题,但是没有人说明优点或缺点是否值得。

Col*_*Two 5

在面向对象的语言中,您会为每个用户创建一个类吗?或者您是否会为每个用户提供一个类的实例?

每个用户一张表是一个非常糟糕的设计。

  • 您无法根据用户名以外的任何字段搜索邮件。使用您当前的解决方案,您将如何查找某个特定消息的所有消息questionNumber
  • 您无法加入消息表。您必须进行两次查询,一次查找表名,另一次实际查询表,这需要与数据库服务器进行两次往返。
  • 每个用户现在都有自己的表架构。在升级时,您必须将模式迁移应用到每个消息表,如果某些表与其他表不一致,上帝会帮助您。
  • 实际上不可能让外键指向消息表。您无法指定外键列指向的表,因为它不会相同。
  • 您的当前设置可能会出现名称冲突。如果有人用该用户名注册怎么办accounts?诚然,通过添加前缀很容易解决这个问题user_,但仍然需要记住一些事情。
  • SQL注入漏洞。如果我注册一个名为 的用户怎么办lol; DROP TABLE accounts; --?查询参数是防止此类攻击的主要方法,它不适用于表名。

我还可以继续说下去。

请合并所有表,并阅读数据库规范化。