【问题标题】:Need help with normalizing my database在规范化我的数据库方面需要帮助
【发布时间】:2009-11-11 12:21:34
【问题描述】:

我不知道是否有人有时间标准化我的数据库?

不知道是不是需要归一化,但是我想把每件事都做到完美,不知道是不是已经做好了。

我已经使用 phpMyAdmin 来创建我的数据库...

背景: 我正在制作分类广告网站。一类广告是“汽车”。到目前为止,我只为汽车创建了数据库,我认为从汽车开始可能会很好......

这是一张桌子:(只有一张)

  1. id (AI) (INT(7))
  2. area_id (VARCHAR(30))
  3. area_community (VARCHAR(30))
  4. 价格(INT(9))
  5. 年(INT(4))
  6. 英里 (INT(6))
  7. 齿轮箱(VARCHAR(12))
  8. 燃料(VARCHAR(12))
  9. 插入日期(时间戳)
  10. 海报名称 (VARCHAR(30))
  11. poster_email (VARCHAR(30))
  12. poster_tel (VARCHAR(20))
  13. poster_password (VARCHAR(15))
  14. poster_zip (INT(5))
  15. private_or_company (INT(2))
  16. 标题 (VARCHAR(60))
  17. 说明(文本)
  18. sell_or_buy (INT(2))
  19. nr_of_pics (INT(2))

如果是这样的话,我会在您每次需要更多输入时更新这篇文章...... 我已经阅读了几篇关于规范化的文章,我了解了这个概念,但真的不知道如何将其付诸实践。

非常感谢!

更新 好的,所以拆分是这里的交易......所以说我已经将海报拆分到一个单独的桌子上。如何将“poster_table”链接到第一个表? 也就是说,如果用户点击一个广告,那么广告就必须显示出来,旁边还有海报名称、日期、区域等……所以必须有一种方法来链接它们,对吗?

【问题讨论】:

  • 是的。您只需添加所谓的“外键”。 “posters”表将有一个名为“id”的“integer auto_increment”列,您将其设置为主键。这将使“海报”表中的每一行在此单元格中都有一个唯一值。然后在“汽车”表中,您将有一个字段“poster_id”。在该字段中,您将为要链接到的“海报”表中的行写入“id”单元格的值。
  • 当您从“cars”表中选择一行时,您可以查看“poster_id”字段并从“posters”表中选择相应的行。这可以通过使用 JOIN 在单个 SELECT 语句中完成。
  • SELECT 语句,当我查询我的数据库时,你的意思是 php?我现在开始明白了,请解释一下...我得到了 PK 和 FK,但不知道如何从一个表字段指向另一个表字段值...
  • 是的,我是指查询时的 PHP。在 PHP 中,您将通过 SELECT、UPDATE、INSERT 和 DELETE 等 SQL 语句完成所有操作。其实,差不多就是这样。不要改变 PHP 的数据库结构 - 你只创建一次表,然后只操作其中的数据。
  • 至于指向的东西——那里没有魔法。只需从“posters”表中取出您需要的行,检查其“id”值(当然是在 PHP 中),然后在对“cars”表执行 INSERT 时将其写入“poster_id”字段。

标签: sql mysql


【解决方案1】:

我建议弄清楚您需要的所有功能,然后开始规划数据库。否则现在这张桌子很好 - 只要它只是用于汽车。如果您想要其他类型的项目,那么这将不够,您将不得不制作更多表格(每种类型的项目一个)或进行更多规范化。

补充:乍一看,您确实需要将海报移到单独的表格中,因为它们就像拥有密码和其他东西的用户。除非您希望某人为每条记录重新登录,否则您应该将其放在单独的表中。否则当一个人更改密码时会发生什么 - 您必须在表中的所有行中更改它!这是相当尴尬和低效的。基本思想是——每条数据都应该只存储在一个地方。如果为了改变一条数据,你必须更新这个数据的几个副本,那么你应该把它移到另一个表中并制作外键。

添加 2: 另一方面 - 也许您不希望您的用户单独登录?也许他们只是发布广告并为每个广告设置一个密码(然后使用密码来编辑特定项目)?在这种情况下,您不应将两个表分开。如果您有两个表,其中的记录是 1:1 的(例如,对于第一个表中的每一行,第二个表中的行不超过也不少于 1 行),那么应该合并表。

【讨论】:

    【解决方案2】:

    有点模糊,但至少应该有以下表格:

    items - corresponding to any item in the classified
    users - person either buying or selling
    addresses - any address
    images - holds an item image
    item_features - hold item specific info like engine, model, etc for a car
    

    【讨论】:

    • 如果您选择这种方式,那么我还将添加表“item_types”、“item_type_features”、“item_type_feature_valid_values”(以防某些功能是下拉列表)。 item_type_features 可以有很多不同的限制(长度、最小值/最大值、下拉列表、整数/双精度/日期/文本/布尔值、正则表达式验证、一些自定义机制等)
    【解决方案3】:

    好的:

    1. 字段 10 到 15(与海报有关)进入单独的表格。向该表添加一个名为 PosterID 的主键,并将字段 10 到 15 替换为字段 PosterID 作为外键返回到该表。

    2. 假设 area_community 是 area_id 的描述,对字段 2 和 3 执行相同操作。另外,请考虑面积是海报还是单个广告的属性。

    3. 字段 5 到 8 存在问题,因为它们使该表成为汽车的表,而不仅仅是广告。我会:A)将其拆分为两个表(Ad 和 Ad_Cars)或(更好)B)创建表 Categories、CategoryProperties 和 AdProperties。类别列出了汽车、家具等。CategoryProperties 列出了每个类别可以或必须具有的属性({car, miles}, {car, gearing}, {car, make})。最后,通过从 CategoryProperties 中获取正确的一组属性来填充 AdProperties,将它们链接到广告(按 ID)并让用户填写值({1、miles、10000}、{1、 gearing、manual})。

    4. 不确定您是如何处理图片的,但我可能会添加一个包含 AdID 和 PictureFileName 的表格 AdPictures。我会摆脱 nr_of_pictures 并从 AdPictures 上的 GROUP BY 视图中获取该信息,除非这会导致性能问题

    【讨论】:

      【解决方案4】:

      如果您查看当前表格,您至少包含四个概念。我会为以下概念制作单独的表格:

      1. 类别
      2. 广告
      3. 卖家(你所谓的“海报”)
      4. 区域
      5. 图片

      我会将广告与具有多对多关系的类别联系起来,将广告与卖家联系起来以多对一关系,或者将区域与广告以多对多联系起来,或者这样做卖家和地区也是如此,具体取决于您追求的设计类型。图片将使用一对多关系链接到广告。

      祝你好运!

      【讨论】:

        【解决方案5】:

        一些cmets:

        拆分区域,并张贴到单独的表格中。

        我会为 insert_date 使用日期类型而不是时间戳。 (但这取决于你如何使用它。)

        您也可以将变速箱和燃料分开,因为它们几乎肯定会重复很多。

        姓名和电子邮件地址的宽度也太小了。

        【讨论】:

          【解决方案6】:

          最简单的方法 - 将海报字段放到不同的表中,然后保存它的 id。我猜同一个人可能会发布多个广告。

          除此之外,还有哪些重复?变速箱和燃料也是标准化的候选对象。

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 2010-10-06
            • 2011-07-17
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            相关资源
            最近更新 更多