基础数据库设计和复杂性

3
我正在设计一个系统,该系统具有用于存储用户及其相关信息的数据库。更具体地说,表中每个用户的信息很少,类似于名称,密码,uid
然后,每个用户都有零个或多个容器,我最初的做法是在数据库中创建第二个表来保存容器,并有一个字段引用拥有它的用户。因此,类似于容器名称,内容,所有者
因此,对容器数据的查询将类似于:
SELECT content
  FROM containers
 WHERE (containerName='someContainer' AND owner='someOwner');

我的问题是:这是一个好的方式吗?我在考虑可扩展性,假设我们有数千个用户,每个用户都有5个容器(但每个用户的容器数量可能不同,但5个可能是典型情况)。我的担忧是,当查询中有5个条目时,通过数据库进行搜索将变得缓慢,而我可能只需要查询其中一个容器的内容,并且我们正在查看具有4995个条目的数据库。如果我订阅了一百万个用户会发生什么呢?它会成为一个庞大的表,直观上感觉这是一个不好的想法。
我另一个想法是为每个用户创建一个表,但这似乎也不是一个很好的解决方法,因为这样会在数据库中创建1000个表(也是根据直觉),这似乎是一个错误的做法。
非常感谢您对如何设计这个问题的帮助,我希望这些都很清晰易懂。

你们会让所有的容器都是唯一的吗?还是会有20-30个容器在所有用户之间共享使用? - vyegorov
嗯..每个用户-容器对都是独一无二的,但不同的用户可能拥有“相同容器”的实例。因此,实际上,用户A-容器A的内容与用户B-容器A的内容不同,明白了吗? - qrikko
然后,您应该为容器创建一个单独的表,在“内容”表中使用“container_id”,并连接3个表。这样可以提高性能,并占用更少的空间。 - vyegorov
1
我有点费劲地理解了一下,但我认为我看到你打算让它如何工作的方式了。而且这很有道理。所以基本上内容查找将减少容器的重复,对吗? - qrikko
1
现在你的设计不符合第二范式 - vyegorov
谢谢,那个链接非常有用。我相信它帮助我把所有的东西都拼凑在一起了。 - qrikko
2个回答

0

处理这个问题的可接受方法是在owner字段上创建一个INDEX。这样,MySQL可以优化查询owner = 'some value'条件。

另请参阅:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

你说1000个表不可扩展,这一点是正确的。一旦你开始达到几百万条记录,你可能需要考虑分片(根据用户属性将记录拆分到多个位置)...但到那时,我想你已经相当成功了;-)


哇,谢谢!这看起来正是我正在寻找的东西,谢谢! - qrikko

0

如果是 RBMS(如 Oracle / MySQL)数据库,您可以在经常查询的列上创建索引来优化表遍历和查询。对于 PRIMARY 和(可选地)FOREIGN 键,索引会自动创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接