基础数据库设计

时间:2013-02-03 16:03:46

标签: sql database

我正在做一些关于PHP和SQL的小项目,以便让我的数据库充满活力。我没有任何正式的数据库培训,我只是熟悉SQL。

我计划跟踪对象表中的对象和属性表中的属性。假设有100个属性,但未来可能会扩展。这两个表只需要两列。

天真地,我会记录哪些对象在一个表中具有哪些属性,其列是属性IDS,行是对象ID。这些条目只是布尔“true / false / null”,具体取决于是否知道对象是否具有该属性。每当添加新对象时,都需要添加一行及其100列。添加新属性时,必须添加一个包含每个对象行的列。

但是,我之前已经阅读过,如果你担心有多少列,你就会遇到设计问题。朋友向我建议了另一张桌子。它将有三列,一个条目只包含对象ID,属性ID和相应的布尔值。在此方案中,添加新对象将需要向此表添加100个新行。

有人可以澄清两种设计中哪一种更好,为什么?由于某种原因,有很多列比有很多行更有问题吗?

如果这是一个重复的问题,我会完全不会感到惊讶,在这种情况下,我感谢你帮我指出了正确的问题。谢谢!

2 个答案:

答案 0 :(得分:2)

这似乎是Many-to-Many关系,因为对象可以有许多属性,同时属性属于许多对象。 (对吗?我希望如此)我建议的数据库架构将是

表对象

  • ObjectID(PK)
  • ObjectName(唯一)

表格属性

  • PropertyID(PK)
  • PropertyName(唯一)

表Object_Property(这是映射表)

  • ObjectID(FK)
  • PropertyID(FK)

示例记录和查询,

答案 1 :(得分:0)

首先,我建议您创建尽可能多的表,因为您拥有不同类型的对象,并且您可以继续将每个不同对象的特定属性作为列放在表中。如果您正在构建一个复杂的关系数据库,其中一些属性将被拉出到其他表中,但如果它很简单,那么它应该不是问题。

当您仅根据对象和属性描述域时,很难理解您在做什么 - 实质上,使用您的数据库,您正在创建您所代表的域的逻辑视图。

例如,在简单的Orders数据库中,您可能拥有客户,产品和订单的表。客户的属性 - 如姓名,地址和手机可能是您客户表中的列。但是,您可能会发现将地址分解为单独的表格更容易,因为您可以让客户使用与其帐单邮寄地址和送货地址相同的地址。

我发现用更具体的术语讨论设计更容易。在完成基础知识后,我会担心完善或优化您的数据库,并且可以创建一个正常运行的系统。

在亚马逊上查看The Pragmatic Programmer