3

我正在编写分类广告网络应用程序。该应用程序有几种类型的广告:

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

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

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

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


  • 包含所有字段并将不适用于当前记录集的字段留空的表。
  • 包含所有广告通用字段的主表,以及具有专有字段的每种广告类型的附加表。
  • 每种广告类型一个表格。
  • 其他

这是我的第一个专业 PHP/MySQL 应用程序,如果问题太简单,请原谅。我只是想确保我实施的解决方案是最好的。请讨论为什么以及如何实施您推荐的解决方案。

4

5 回答 5

2

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

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

  • 先前的评论尤其适用于您的数据存储成本较低的情况。

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

  • 如果每种广告类型有很多自定义字段,您可能更愿意将每种广告类型分别放在各自的表格中,以便于维护和数据存储优化。然后,您可以通过 JOIN 或 UNION 查询您的广告列表。

如果我想到别的东西,我会补充我的答案。

于 2013-02-05T13:30:57.940 回答
1

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

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

于 2013-02-05T13:18:43.323 回答
1

所有解决方案都是可接受的,并且取决于偏好、性能、复杂性和设计需求。您正在讨论的术语是 Table-Per-Type、Table-Per-Class 和 Table-Per-Hierarchy。如果您在这些方面进行谷歌搜索,您肯定会获得大量的实体框架结果,但底层设计考虑因素大致相同。

于 2013-02-05T13:20:57.043 回答
1

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

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

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
于 2013-02-05T13:35:54.377 回答
0

好吧,将值存储在列中而不是行中,因此创建一个表并包含 3 列:ad_type、property、value

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

希望有帮助

于 2013-02-05T13:14:27.337 回答