我正在编制一个网站,允许用户发布分类广告,其中包含他们销售的不同类型商品的详细字段。但是,我对最佳数据库架构有疑问。
该网站有许多类别(例如汽车,电脑,相机),每类广告都有自己独特的字段。例如,汽车具有诸如门数,品牌,型号和马力等属性,而计算机具有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这样的网站会怎么做?
答案 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)。