需要有关规范化数据库的帮助

时间:2009-11-11 12:21:35

标签: sql mysql

我想知道某人是否有时间规范我的数据库?

我不知道它是否需要正常化,但我想完美地完成所有事情,而且我不知道它是否已经好了。

我使用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. insert_date(TIMESTAMP)
  10. poster_name(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. description(TEXT)
  18. sell_or_buy(INT(2))
  19. nr_of_pics(INT(2))
  20. 每次你需要更多输入时我会更新这篇文章,如果是这样的话...... 我已经阅读了几篇关于规范化的文章,我得到了这个概念,但是我真的不知道如何将它付诸实践。

    非常感谢!

    更新 好吧,所以拆分是这里的交易...所以说我把海报分成了一个单独的表。如何将'poster_table'链接到第一个表格? 也就是说,如果用户点击广告,然后必须显示广告,旁边的海报名称,日期,区域等等......所以必须有一种方法来链接它们,我是对的吗?

6 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

一些意见:

将区域和海报拆分为单独的表格。

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

你也可以拆分变速箱和燃油,因为它们几乎肯定会重复很多。

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

答案 2 :(得分:0)

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

已添加:乍一看,您需要将海报移到单独的表格中,因为它们就像是有密码和内容的用户。除非您希望某人为每条记录创建新的登录名,否则您应该将其放在单独的表中。否则当一个人更改密码时会发生什么 - 你必须在表中的所有行中更改它!这非常尴尬和低效。基本思想是 - 每个数据应该只存储在一个地方。如果为了更改单个数据,您必须更新此数据的多个副本,那么您应该将其移出到另一个表并创建外键。

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

答案 3 :(得分:0)

如果查看当前表,则至少捆绑了四个概念。我会针对以下概念制作单独的表格:

  1. 分类
  2. 广告
  3. 卖家(你称之为'海报')
  4. 图片
  5. 我会将广告与具有多对多关系的类别相关联,广告与卖家进行多对一关联,并将广告区域与多对多关联,或者与卖家和区域相同,取决​​于您追求的设计类型。图片将使用一对多关系链接到广告。

    祝你好运!

答案 4 :(得分:0)

好:

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

  2. 对字段2& 3,假设area_community是area_id的描述。另外,请考虑区域是否属于海报或个别广告的属性。

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

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

答案 5 :(得分:-1)

最简单 - 将海报字段放到另一个表中,然后保存其ID。我猜同一个人可能会发布多个广告。

除此之外 - 重复是什么?变速箱和燃料也是正常化的候选者。