SQLite:每个用户的单个表还是一个表的所有表?

时间:2015-06-22 14:45:31

标签: database sqlite

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

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

是否值得重新设计我的网站,以便有一个大桌子而不是有很多桌子?虽然目前的方法仍在开发中,但目前的方法似乎运作良好,所以我不确定它在真实环境中的堆积效果如何。

问题是:在性能,效率,组织和空间方面,更改代码以便有一个大型数据库而不是许多个人数据库值得吗?

SQLite:创建用户的表格。

CREATE TABLE " + name + " (id INTEGER PRIMARY KEY, subject TEXT, topic TEXT, questionNumber INTEGER, question TEXT, answer TEXT, color TEXT)

SQLite:在帐户表格中添加帐户。

"INSERT INTO accounts (name, email, password, activated) VALUES (?,?,?,?)", (name, email, password, activated,)

请注意,如果有任何不同,我会在Flask中使用python。

修改

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

1 个答案:

答案 0 :(得分:1)

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

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

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

我可以继续。

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