数据库已优化,可用于搜索具有不同属性的大量对象

时间:2014-01-27 19:55:58

标签: mysql database nosql

我目前正在使用EAV方法搜索我们老化的MySQL数据库的替代方案。当前的项目似乎已经超出了传统的面向表的数据库结构,特别是在这样的数据库中搜索。 我领导并研究了各种NoSQL数据库系统,但我找不到任何似乎正在寻找的东西。也许你可以提供帮助。

我将向您展示一个关于我拥有什么类型的数据以及我想对它们执行哪些操作的一般化示例:

我有一个具有少量META属性的对象。对象的所有实例共有的属性。例如这些

DataObject Common(META)属性

  • 唯一ID(某种包含唯一标识符的字符串)
  • 创建日期(显示对象创建时间的日期时间)
  • 类型(某种类型的标识符,可能类似“文章”,“新闻”,“图片”或“视频”
  • ......我认为你得到了想法

然后我的每个对象都有可变数量的其他属性。很可能,许多对象将共享许多这些属性,但没有规则。对于我的示例,我们说每个Object实例都有5到20个这样的属性。以下是一些示例

数据对象变量属性

  • 颜色(有些CSS喜欢颜色字符串)
  • 姓名(字符串)
  • 类别(此项目的类别或标签)(也许我们还有多个?)
  • 网址(包含某些网站的网址)
  • 费用(带小数的数字
  • ......还有很多其他的东西大多是通常的列类型

对其他数据的引用是一个想法,但目前还不是必须的。如果需要,我可以在我的应用程序逻辑中提供这些。

小样本:

图像

  • 唯一ID =“0s987tncsgdfb64s5dxnt”
  • 创建日期=“2013-11-21 12:23:11”
  • Type =“Image”
  • Title =“一只可爱的猫咪”
  • 类别=“动物”
  • 尺寸=“10234”
  • Mime =“image / jpeg”
  • Filename =“cat_123.jpg”
  • 版权=“无”

典型操作

平均存储量可能有大约1-5百万个这样的对象,每个对象有5-20个属性。

除了通常的东西,比如将一个对象写入数据库或通过它的uid读取它,最有问题的操作是:

  • 按多个属性搜索 - 选择每个类型为“新闻”的DataObject,标题包含“蓝色”,创建日期在2012之后。
  • 分页批量阅读 - 从元素100开始到250结束时从搜索中获取大量对象(见上文)
  • 获取具有所有属性的许多对象 - 当读取大量对象时,我需要在一次调用中获取具有所有属性的每个对象。

存储要求

  • 持久性 - 存储需要持久存在,而不是仅存储在内存中。如果服务器重新启动,则数据必须与之前关闭的时间相同。没有内存系统。
  • 完整性 - 所有数据都很重要,没有什么可以忽略的。因此,必须安全地存储每一个写操作。系统(Redis?)往往会松动某些东西然后不可用。具有巨大异步性的系统也存在问题。如果数据发生变化,每个负责任的节点都应该看到。
  • 复杂性 - 系统应该相当容易设置和维护。因此,迫使管理员在其使用中使用长达数周的课程的系统在这里并不是真正的解决方案。具有大量节点的大型数据仓库也是如此。集群很好,但也应该可以通过一个节点获得廉价的系统。

TL;博士

需要具有面向对象数据的超快数据库系统,即使有数十万个项目也能快速搜索。

我可以在此处找到我寻找更好的mysql替代方案的原因:Need MySQL optimization for complex search on EAV structured data

<小时/> 的更新

像Redis这样的键值存储不是一个选项,因为我们需要对数据进行大量搜索。在典型的键值存储中不可能的某些东西。

最后,我们使用MongoDB略微优化的方案,以充分利用MongoDB对indizes的使用。

一些小缺点仍然存在,但目前可以接受: - MongoDBs聚合函数不能用非常大的结果集进行wotk。我们必须使用find(并优化我们的数据结构以使其足够) - 您无法对特定值上的大型数据集进行排序,因为它会占用大量内存。您也无法在这些值上创建indizes,因为它们是无架构的。

1 个答案:

答案 0 :(得分:2)

我不知道你是不是比我更复杂的答案。但也许我可以激励你一点点。

MySql是可扩展的,可以用于您的课程。我认为如果你的数据库速度慢,那更多的是优化和服务器问题。许多具有大量数据的系统使用MySql并且工作得很好,尽管NoSql(Not-Only SQL)是针对具有不同属性的大量数据构建的。

有许多不同的NoSql提供程序,它们有不同的处理数据的方法。 在选择NoSql平台之前考虑一下。

可能性

  • 键值商店 - 例如Redis,Voldemort,Oracle BDB
  • 专栏店 - 例如Cassandra,HBase
  • 文件商店 - 例如CouchDB,MongoDb
  • 图表数据库 - 例如Neo4J,InfoGrid,无限图

大多数网站都使用基于文档的存储,但是ex。 facebook正在使用基于列的,因为有许多动态的属性。

您可以在http://try.mongodb.org/

尝试基于文档的NoSql

最后,它实际上取决于您如何构建和优化数据库,而不是您选择哪种技术,尽管选择合适的技术可以节省大量时间。

我们开发的系统使用MySql和NoSql的组合,具体取决于我们使用的数据。系统本身的MySql和我们通过API导入的所有数据的NoSql。

希望这会激发一点,并随意提出任何问题