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

我们试图以这种方式解决它。

我们有 table

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。

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

最佳答案

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

基本上,您将现实生活中的对象与其参数分开:
汽车:发动机、颜色、座椅、车门等。
自行车:车架尺寸、车轮尺寸、颜色、重量等。

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

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

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

有什么意义,一些选择:

  • 只是给一个对象它自己的标签,所以 table 汽车, table 自行车等。
  • 将对象的所有属性添加到一个表中(可为空)。所以:object_type(自行车/汽车)、引擎、颜色、座椅、门、车架尺寸、车轮尺寸、照明等。
  • 想想一些多对多的设计,比如标签,这就是你现在要走的路。
  • 想想另一种存储数据的方式,RDBMS 很多时候是正确的,但对于像键值存储数据库这样的灵活存储可能更合适。
  • 关于database - 将带有参数的对象存储在数据库中并获取它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9063779/

    10-11 22:25
    查看更多