Database 在数据库中存储具有参数和值的对象并获取它们

Database 在数据库中存储具有参数和值的对象并获取它们,database,optimization,Database,Optimization,我们正在开发一个类似craigslist的广告发布网站。我们有广告,分类和它的参数。参数附加到类别。参数有值。这些值依赖于其他值。例如,当我选择param“BMW”时,必须出现BMW车型,如“X6、X5、M3”等 我们试图用这种方法解决这个问题 我们有桌子 Params(id, category_id, parent_id, name) ParamValues(id, param_id, is_string, int_value, string_value) Ads(id,category_id

我们正在开发一个类似craigslist的广告发布网站。我们有广告,分类和它的参数。参数附加到类别。参数有值。这些值依赖于其他值。例如,当我选择param“BMW”时,必须出现BMW车型,如“X6、X5、M3”等

我们试图用这种方法解决这个问题

我们有桌子

Params(id, category_id, parent_id, name)
ParamValues(id, param_id, is_string, int_value, string_value)
Ads(id,category_id) and Ads_paramvalues_join(ad_id, param_value_id).
我们添加了string_值和int_值,因为当用户进行搜索时,他可以从列表中选择int范围或常量值

问题是,
连接表(Ads\u paramvalues\u join)
将变得非常大,因为它将包含来自每个参数值的映射。似乎这可能会导致性能问题

这里我们使用的是Hibernate3,Spring3MVC


我们想知道在这种情况下,是否有其他类型的最佳实践和模式可以解决此类问题。

在运行关系数据库时,您应该首先将问题分开,我希望您这样做:

在basic中,您将真实对象与其参数分开: 汽车:发动机、颜色、座椅、车门等。 自行车:车架尺寸、车轮尺寸、颜色、照明等

它们只是不同,基于规范化,将它们全部分组到一个表中会很奇怪。汽车不是自行车

现在你有一个问题,你把它们看作某种一般的对象:广告

事实上,这就是问题的起点:您正在数据库中构建一个数据库。这不是一个众所周知的好做法

有意义的是,一些选项:

  • 只要给一个对象一个它自己的标签,那么一个表车,一个表自行车等等

  • 将对象的所有属性添加到一个表中(可为空)。So:物体类型(自行车/汽车)、发动机、颜色、座椅、门、框架尺寸、车轮尺寸、照明等

  • 想想一些多对多的设计,比如标签,这就是你现在要做的

  • 考虑另一种存储数据的方式,RDBMS在很多情况下都是正确的,但是对于这种灵活的存储,如键值存储数据库,可能更合适


  • 这种结构是一种被称为“实体属性值”(EntityAttribute-Value,EAV)模式。EAV模式的使用被广泛认为是一种反模式。书中有一段很好的文字——在网上有一些幻灯片,你应该可以用谷歌搜索。正如Luc所建议的那样,你应该给每种类型都提供自己的表格。非常感谢。我有大约100件物品。除了汽车,我还有衣服,厨房用品,电视,收音机,杯子,甚至勺子。所以你说我必须为他们每个人做单独的桌子?!这不需要很多时间吗?这就是好的实践吗?只要看一下这些物体就可以了。但它也有缺点,例如:我们总共做了多少广告?你需要打电话到很多桌子上去。虽然看起来是可行的。当然,当您使用外部搜索索引时,比如Solr。如果你有一个大数据库的严肃商业案例,我会尽量不把它放在普通的RDBMS中。以MongoDB为例。这类数据库更易于扩展,并允许您在分配给产品的属性方面具有更大的灵活性。可能相关: