单一继承还是多态?

时间:2010-12-09 20:15:56

标签: polymorphic-associations single-table-inheritance database-schema table-structure

我正在编制一个网站,允许用户发布分类广告,其中包含他们销售的不同类型商品的详细字段。但是,我对最佳数据库架构有疑问。

该网站有许多类别(例如汽车,电脑,相机),每类广告都有自己独特的字段。例如,汽车具有诸如门数,品牌,型号和马力等属性,而计算机具有CPU,RAM,主板模型等属性。

现在因为它们都是列表,我正在考虑一种多态方法,为每个不同的类别(COMPUTERS,CARS,CAMERAS)创建一个父LISTINGS表和一个不同的子表。每个子表都有一个listing_id,它将链接回LISTINGS TABLE。因此,当获取列表时,它将从关联子表中链接行连接的LISTINGS中获取一行。

LISTINGS
-listing_id
-user_id
-email_address
-date_created
-description

CARS
-car_id
-listing_id
-make
-model
-num_doors
-horsepower

COMPUTERS
-computer_id
-listing_id
-cpu
-ram
-motherboard_model

现在,这个架构是一个好的设计模式还是有更好的方法来实现这个目标?

我考虑过单一继承,但很快就忽略了这个想法,因为桌子会变得太快太快,但是另一个困境浮现在脑海中 - 如果用户对所有列表进行全局搜索,那么这意味着我将不得不分别查询每个子表。如果我有超过100个不同的类别会发生什么,这不会效率低下吗?

我还想到了另一种方法,其中有一个主表(元表),用于定义每个类别中的字段,以及一个字段表,用于存储每个列表的字段值,但是这会违反数据库规范化吗?

像Kijiji这样的网站会怎么做?

2 个答案:

答案 0 :(得分:2)

您的数据库设计很好。没理由改变你所拥有的。我已经看到搜索做了几个方面。一种方法是让您的搜索存储过程加入您需要搜索的所有表,并索引要搜索的列。我看到它做得非常好的第二种方法是有一个仅用于搜索的表,它获取需要搜索的任何字段的副本。然后,您将在这些字段上放置触发器并更新搜索表。

它们都有缺点,但我更喜欢第一个到第二个。

修改

您需要以下表格。

分类 - ID - 说明

CategoriesListingsXref - CategoryId - ListingId

使用此交叉参考模型,您可以在搜索期间加入给定类别的所有商品。然后添加一个小动态sql(因为它更容易理解)并构建您的查询以包含您要搜索的字段并在查询上调用execute。

就是这样。

编辑2 这似乎是一个更大的讨论,我们可以在这些评论框中找到。但是,通过阅读以下文章可以理解我们将讨论的任何内容。         http://www.sommarskog.se/dyn-search-2008.html

这是非常完整的,并向您展示了不止一种方式,无论是赞成还是缺点。 祝你好运。

答案 1 :(得分:0)

我认为您选择的设计对您刚才描述的场景有好处。虽然我不确定子类表是否应该有自己的ID。由于CAR是一个列表,因此值来自同一个“域”是有道理的。

在典型的分类广告网站中,广告的数据会被写入一次,然后基本上是只读的。您可以利用这一点并将数据存储在第二组表中,这些表更适合于以您希望用户搜索的方式进行搜索。此外,搜索问题仅存在于“一般”搜索中。一旦用户选择了某种类型的广告,您就可以切换到子类表以进行更高级的搜索(RAM> 4gb,cpu = overpowered)。