数据库设计:实现同一实体的几种类型


Database design: implementing several types of the same entity

我正在编写一个Classified Ads web应用程序。该应用程序有几种类型的广告:

  1. 一般广告(电子产品、玩具、宠物、书籍…)
  2. 房地产(房屋、公寓、地形…)
  3. 车辆(摩托车、轿车、面包车、卡车…)

每种类型都有几个通用字段(id、title、description),还有一些是同类独有的字段:

  1. 一般广告(没有专属字段)
  2. 房地产(面积、物业类型…)
  3. 车辆(车辆类型、容积、公里…)

对于这种情况,最推荐的方法是什么?

  • 包含所有字段并将
    不应用于当前记录集
  • 一个包含所有广告共有的字段的主表,以及一个针对每种类型的具有独占字段的广告的附加表
  • 每种广告类型一张表
  • 其他

我会根据各种标准构建一个解决方案:

  • 如果您认为该表将来会很大(将发布大量广告),您可能希望最小化JOIN的数量以获得更好的性能=>选项1。"当与广告类型无关时,一个带有空字段的表"

  • 以前的评论适用,尤其是在数据存储成本较低的情况下。

  • 如果您必须根据某些字段值(例如房屋大小、汽车公里数)查询数据,您可能会避免使用phpalix(ad_type|property|value)或Andy Gee描述的解决方案,因为您的SQL语法将是一场噩梦,并且更喜欢将所有数据(再次)放在同一个表中。

  • 如果每个广告类型有很多自定义字段,您可能更喜欢将每个广告类型单独放在自己的表中,以便于维护和数据存储优化。然后,您可以选择JOIN或UNION来查询您的广告列表。

如果我想其他的话,我会补充我的答案。

您可以规范化(抽象概念的表和专业概念的表)或去规范化(包含所有字段的表)

与往常一样,必须根据每个解决方案的成本进行选择,以查询速度为代表(标准化的模型意味着更多的连接(缓冲区/cpu),而非标准化的更多磁盘读取通常是因为有时在不必要的时候会检索列)或这两种情况下所需的存储。

所有解决方案都是可接受的,这取决于偏好、性能、复杂性和设计需求。您正在讨论的术语是"每类型表"、"每类表"answers"每层次表"。如果你在上面搜索,你肯定会得到大量的实体框架结果,但底层的设计考虑因素基本相同。

为了灵活性,我将所有字段都放在一个单独的表中,然后允许将每个字段分配给每个广告类型。这也将允许您在以后轻松添加和删除字段。每个字段可能有不同类型的数据,因此这些信息也应该在一个单独的表中。

像这样的东西(不是很清楚,对不起)

Table: fields
field_id, field_type, field_name
1         1           title
2         1           price
3         2           size
4         3           description
5         1           square meters
Table: field_types
field_type_id, type
1,             textbox
2,             select_box
3,             text_area
Table: field_data
field_data_id, ad_id, field_id, field_type_id, field_data
1              1      1         1              Cool t-shirt
2              1      2         1              5.99
3              1      3         2              L,XL,XXL,XXXL
4              1      4         3              Some description
5              2      1         1              Nice house
6              2      2         1              250000
7              2      4         3              Some description
8              2      5         1              1024sq/m
Table: ad_types
ad_type_id, ad_type_name, fields
1           general       1,2,3,4
2           real_estate   1,2,4,5

好吧,把值存储在列中,而不是行中,所以创建一个表,并有3列:ad_type,属性,值

为每种类型的广告定义属性,并为其字段查询广告类型。

希望对有所帮助