2013-02-03 40 views
0

我正在做一个PHP和SQL的小项目,让我的脚湿润与数据库。我没有任何正式的数据库培训,我只是具有SQL的工作知识。基本数据库设计

我打算跟踪对象表中的对象和属性表中的属性。假设有100个属性,但未来可能会扩大。这两个表都只需要两列。天真地,我会记录哪些对象在一个表中具有哪些属性,其列是属性IDS,而行是对象标识。根据对象是否具有或不具有属性,条目将简单地为布尔型“true/false/null”。每当添加新对象时,需要添加一行100列。添加新属性时,必须添加一列包含每个对象的行。

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

有人可以澄清两种设计哪种更好,为什么?由于某些原因,有很多列比有很多行更麻烦?

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

+0

100列?我不可能明白为什么你需要这么多列。 SQL的工作知识并没有真正帮助数据库设计。看看[数据库规范化](http://en.wikipedia.org/wiki/Database_normalization)和[关系模型](http://en.wikipedia.org/wiki/Relational_model) – Kermit

+0

@njk我希望不要使用那么多,我只是说从初学者的角度来看,$ m \ grid是设想记录$ n $对象上$ m $属性状态的最简单方法。我意识到它可能更好地以不同的方式存储。 – rschwieb

回答

2

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

表对象

  • 对象ID(PK)
  • 对象名(唯一)

表属性

  • 属性ID(PK)
  • 的PropertyName(唯一)

表Object_Property(这是一个映射表)

  • 的ObjectID(FK)
  • 物业ID(FK)

实施例的记录和查询,

+0

是的,多对多。还要感谢关于如何选择按键的信息!这是非常有用的... – rschwieb

+0

不客气的朋友! –

+0

只是一个简单的问题:你提议的Object_Property表将如何保存每对涉及的True/False/Null记录?当给定ObjectID时,我将有一个查询返回所有属性的状态,其中许多属性可能未知。它会成为该表的第三列吗?如果是这样,这听起来像你是担保我在OP提到的第二种方法。 – rschwieb

0

要开始我建议你有不同类型的对象所创建的许多表和你继续前进,把每个不同对象的特定属性表中的列。如果你正在构建一个复杂的关系数据库,其中一些属性会被拉出到其他表中,但如果它很简单,那么它就不成问题。

当你只用对象和属性来描述域时,很难理解你在做什么 - 实质上,在你的db中,你正在创建你所代表的域的逻辑视图。

例如,在一个简单的订单数据库中,您可能有客户,产品和订单的表。客户的属性 - 名称,地址&电话可能是客户表中的列。但是,您可能会发现将地址分解成单独的表格更容易,因为您可以让一位客户使用与其帐单地址和送货地址相同的地址。

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

在Amazon上查看The Pragmatic Programmer

+0

对不起......因为我没有计划为SQL预算超出此项目的时间,所以对我来说太深入了解是不可行的。我也无法想象如何为每个对象获取一批表,然后查询它们以查看哪些对象具有某个属性。 (也许这是可能的,但我绝对不知道该怎么做:))我似乎想将它们关联在一张表中,然后进行查询。 – rschwieb