我在SO Indexing on several fields in mongoDB的NOSQL数据库的上下文中提出了类似的问题,很快意识到它与任何数据库无关,而是一般的设计问题。我将尝试再次制定查询,因此听起来很通用:
我需要在每个DB中存储每个对象的信息。每个对象可以具有可变数量的属性,每个属性名称也可以不同。我们可以将属性数量上限设置为10,如果这样可以让我们的生活更轻松,那么可能是关系数据库世界。
对象1:
name : "Cupboard Number 1"
type: "Cupboard"
material : "Wood"
dimensions : "12X15"
built on : "2nd oct 2014"
id : 12212
对象2:
name : "Tommy"
type : "Pet"
owner : "Tom"
born : "1 June 2010"
id : 12321
因此每个对象可能具有不同的属性/字段。我希望通过过滤任何属性组合来灵活地查询此数据库。由于数据库可能非常庞大,我希望数据检索速度快,我希望能够进行某种索引以加快查询速度。
示例查询可能是:
我在考虑使用一个表/集合,其中所有属性都可以放入一个对象中,但无法看到索引是如何实现的。我显然可以将对象分解为单个属性对象然后存储它,这意味着有这样的东西:
对象1有多个单独的行/对象:
{ "attr_name" : "name", "attr_value" : "Cupboard Number 1", "id" : 12212 }
{ "attr_name" : "type", "attr_value" : "Cupboard", "id" : 12212 }
{ "attr_name" : "material", "attr_value" : "Wood", "id" : 12212 }
{ "attr_name" : "dimensions", "attr_value" : "12X15", "id" : 12212 }
{ "attr_name" : "built on", "attr_value" : "2nd oct 2014", "id" : 12212 }
现在我可以在attr_name上创建索引并获取' id',我可以使用它来收集该对象的所有记录。但是,这不会超出一个属性的直接工作,而我的要求是在一个查询中过滤多个属性。如果我必须使其工作超出一个过滤器属性,那么我需要为每个过滤器属性运行多个查询,然后将所有结果加入" id"。我看待它的方式效率不高。
让我们简化一些事情,假设任何对象的属性不会超过10个。因此,我们可能有一个RDBMS表,每个属性名称有一列,该属性的值有一列。所以我们可以有一个像这样的巨型表模式:
attrName1 // attribute 1 Name
attrName2 // attribute 2 Name
...
attrVal1 // attribute 1 Value
attrVal2 // attribute 2 Value
..
id
因此可以按如下方式插入对象1:
('name', 'type', 'material', 'dimensions', 'built on', '','','','','','Cupboard Number 1','Cupboard','Wood','12X15','2ndOctober 2014',,,,,,12212)
在所有列1-10上都有单独的索引会加快查询速度(尽管它仍会执行连接,这很糟糕)。这是解决此问题的唯一方法,但我们需要了解属性在行中出现的顺序(材料在第3列中等)。我正在寻找能够以更优雅的方式解决这个问题的方法。任何数据库都没问题,如果有博客的链接试图解决这样的问题,请告诉我。