我正在开发一个介于电子邮件服务和社交网络之间的Web应用程序.我觉得它有可能在未来发展壮大,所以我担心可扩展性.
我决定为每个活跃用户创建一个单独的SQLite数据库,而不是使用一个集中式MySQL/InnoDB数据库然后对其进行分区:每个"分片"一个活跃用户.
这样,备份数据库就像每天一次将每个用户的小型数据库文件复制到远程位置一样简单.
扩展将像添加额外的硬盘来存储新文件一样简单.
当应用程序超出单个服务器时,我可以使用GlusterFS在文件系统级别将服务器链接在一起并运行应用程序,或者构建一个简单的SQLite代理系统,允许每个服务器操作相邻服务器中的sqlite文件.
并发问题将是最小的,因为每个HTTP请求一次只能触及一个或两个数据库文件,成千上万,而SQLite只会阻止读取.
我敢打赌,这种方法可以让我的应用程序优雅地扩展,并支持许多很酷和独特的功能.我打错了吗?我错过了什么吗?
更新我决定采用一种不太极端的解决方案,到目前为止工作正常.我正在使用固定数量的分片 - 准确地说是256个sqlite数据库.通过简单的散列函数将每个用户分配并绑定到随机分片.
我的应用程序的大多数功能每个请求只需要访问一个或两个分片,但有一个特别需要在256到10个不同的分片上执行简单查询,具体取决于用户.测试表明,如果所有数据都缓存在RAM中,则需要大约0.02秒或更短的时间.我想我可以忍受这个!
UPDATE 2.0我移植应用到MySQL/InnoDB和能够得到有关规则请求相同的性能,但对于需要碎片步行一个请求时,InnoDB快4-5倍.出于这个原因,以及其他原因,我正在放弃这种架构,但我希望某个地方找到它的用途......谢谢.
我想设计一个JVM数据结构(Java/Scala),可用于表示和存储任意关系数据库表的内容.数据结构应该快速(不太gc密集,缓存友好)和内存高效,因此更大的表可以适合RAM.
一种节省内存的解决方案是将每个列分别存储在基本数组中,但我担心缓存友好性,因为同一行中的项不会存储在一起.无论列有多窄,具有N列的行都将导致N个高速缓存未命中.
另一个解决方案是将每一行存储在一个对象数组中,其中每个元素代表一个字段,并在检索时转换为正确的类型,但这需要以其盒装形式存储数字类型,因此它的内存效率不高.并且它可能也不是那种高效缓存.
另一个解决方案是将每行的数据布局为字节数组,就像真正的数据库序列化它们的行一样,只使用必要的字节数.这是缓存友好和内存效率,但我担心每次访问时序列化/反序列化的成本.
什么是最好的方式?
如何在表中的两个字段上有效地创建唯一索引,如下所示:create table t(整数,b整数);
其中两个不同数字的任何唯一组合在表格的同一行上不能出现多次.
换句话说,如果存在a = 1且b = 2的行,则在a = 2且b = 1或a = 1且b = 2的情况下不能存在另一行.换句话说,两个数字不能以任何顺序一起出现多次.
我不知道这样的约束是什么,因此标题中的"双面唯一索引"名称.
更新:如果我在列(a,b)上有复合键,并且数据库中存在行(1,2),则可以插入另一行(2,1)而不会出现错误.我正在寻找的是一种防止同一对数字在任何顺序中被多次使用的方法......
我正在用Python开发一个'TreeDict'类.这基本上是一个dict,允许您按排序顺序检索其键值对,就像Java中的Treemap集合类一样.
我已经基于关系数据库中的唯一索引的方式实现了一些功能,例如,允许您检索与一系列键相对应的值,大于,小于或等于按排序顺序的特定值的键,字符串或按排序顺序具有特定前缀的元组等.
不幸的是,我想不出任何需要像这样的课程的现实生活问题.我怀疑我们在Python中没有排序的原因是,在实践中它们并不经常被要求得到它,但我想被证明是错误的.
你能想到'TreeDict'的任何具体应用吗?这个数据结构最能解决的任何现实问题?我只是想知道这是否值得.
architecture ×1
collections ×1
constraints ×1
database ×1
datatable ×1
dictionary ×1
indexing ×1
java ×1
mysql ×1
python ×1
relational ×1
scala ×1
scalability ×1
sharding ×1
sqlite ×1
treemap ×1
unique ×1
uses ×1