使用带有值的params存储对象并获取它们

时间:2012-01-30 12:20:07

标签: database optimization

我们正在开发一个类似于craigslist的广告发布网站。我们有广告,类别及其参数。参数附属于类别。而且参数具有价值。这些值取决于其他值。例如,当我选择param“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_value和int_value,因为当用户进行搜索时,他可以从列表中选择int范围或常量值。

问题是 - join table(Ads_paramvalues_join)将变得非常大,因为它将包含来自每个参数值的映射。似乎它可能会导致性能问题。

这里我们使用的是Hibernate 3,Spring 3 MVC。

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

1 个答案:

答案 0 :(得分:2)

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

在基本的情况下,你有一个独立的现实生活对象及其参数: 汽车:发动机,颜色,座椅,门等 自行车:车架尺寸,车轮尺寸,颜色,闪电等。

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

现在您遇到的问题是您将它们视为某种通用对象:广告。

这就是你的问题开始的地方,事实上:你正在数据库中构建一个数据库。这不是一个众所周知的良好做法。

有什么意义,有些选择:

  1. 只要给一个物体它自己的表格,所以有桌车,桌子自行车等。

  2. 将对象的所有属性添加到一个表中(可为空)。所以:object_type(自行车/汽车),发动机,颜色,座椅,车门,框架尺寸,车轮尺寸,闪电等等。

  3. 想想一些像标签这样的多对多设计,这就像你现在的方式一样。

  4. 考虑一种不同的存储数据的方式,RDBMS很多时候都是正确的,但对于像键值存储数据库这样的灵活存储可能更合适。