【问题标题】:Single Inheritance or Polymorphic?单继承还是多态?
【发布时间】:2011-05-23 02:36:38
【问题描述】:

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

该网站具有许多类别(例如汽车、计算机、相机),并且每个类别的广告都有自己不同的字段。例如,汽车具有门数、品牌、型号和马力等属性,而计算机具有 CPU、RAM、主板型号等属性。

现在因为它们都是列表,所以我正在考虑一种多态方法,为每个不同的类别(计算机、汽车、相机)创建一个父 LISTINGS 表和一个不同的子表。每个子表都有一个listing_id,它将链接回列表表。因此,当获取列表时,它将从 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 这样的网站是如何做到的?

【问题讨论】:

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


    【解决方案1】:

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

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

    编辑

    您需要以下表格。

    类别 - ID - 描述

    CategoriesListingsXref - 类别 ID - 列表编号

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

    就是这样。

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

    它真的很完整,向您展示了不止一种方法,各有优缺点。 祝你好运。

    【讨论】:

    • 您需要一个类别表。您需要有一个针对列表的类别的交叉引用表。然后用户将在搜索期间选择一个类别。您可以将 category_id 传递给 search_stored_proc,它会使用 category_id 通过 categories-xref 表与您想要搜索的任何字段相结合。有一些细节我在这里无法理解。也许我应该编辑原始答案。但这是您要遵循的概念。
    • 或者您可以使用动态 sql 并构建您的搜索查询并调用它。这也是一个很好的方法。有关如何指导的信息,请参见这篇文章。 sqlteam.com/article/introduction-to-dynamic-sql-part-1
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 2015-03-10
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多