Sql 基础数据库设计

Sql 基础数据库设计,sql,database,Sql,Database,我正在用php和SQL做一个小的辅助项目,以便熟悉数据库。我没有接受过任何数据库方面的正式培训,我只是掌握了SQL的工作知识 我计划跟踪对象表中的对象和属性表中的属性。假设有100处房产,但将来可能会扩大。这两个表只需要两列 天真地说,我会在一个表中记录哪些对象具有哪些属性,该表的列是属性ID,行是对象ID。根据对象是否具有或缺少属性,条目将只是布尔值“true/false/null”。每当添加新对象时,都需要添加一行及其100列。添加新特性时,必须为每个对象添加一列和一行 然而,我以前读过,如

我正在用php和SQL做一个小的辅助项目,以便熟悉数据库。我没有接受过任何数据库方面的正式培训,我只是掌握了SQL的工作知识

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

天真地说,我会在一个表中记录哪些对象具有哪些属性,该表的列是属性ID,行是对象ID。根据对象是否具有或缺少属性,条目将只是布尔值“true/false/null”。每当添加新对象时,都需要添加一行及其100列。添加新特性时,必须为每个对象添加一列和一行

然而,我以前读过,如果你担心有多少列,你就有一个设计问题。一位朋友向我推荐了另一张桌子。它有三列,一个条目只包含对象ID、属性ID和相应的布尔值。在这个方案中,添加一个新对象需要向这个表中添加100个新行

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


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

这似乎是一种
多对多
关系,因为一个对象可以有多个属性,同时属性属于多个对象。(对吗?我希望如此)我建议的数据库模式是

表对象

  • 目标(PK)
  • 对象名称(唯一)
表属性

  • 属性ID(主键)
  • PropertyName(唯一)
表对象_属性(这是一个映射表)

  • ObjectID(FK)
  • 房地产ID(FK)
示例记录和查询


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

当您仅从对象和属性的角度描述域时,很难理解您在做什么——本质上,使用db,您正在创建所表示域的逻辑视图

例如,在一个简单的Orders数据库中,您可能有客户、产品和订单的表。客户的名称、地址和电话等属性可能是customer表中的列。但是,您可能会发现将地址拆分为一个单独的表更容易,因为您可能有一个客户使用与其账单地址和发货地址相同的地址

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


在亚马逊上查看。

100列?我不明白你为什么需要这么多专栏。SQL的实用知识对数据库设计没有帮助。查看并@njk我不希望使用那么多,我只是说从初学者的角度来看,$n\times m$网格是在$n$对象上记录$m$属性状态的最简单方法。我意识到以不同的方式存储可能更好。是的,多对多。还感谢您提供有关如何选择钥匙的信息!这是非常有用的…只是一个简单的问题:您提议的Object_属性表如何保存所涉及的每一对的真/假/空记录?当给定ObjectID时,我将让查询返回所有属性的状态,其中许多属性可能是未知的。它会是该表中的第三列吗?如果是这样,听起来你是在为我在OP.Wjy中提到的第二种方法担保。你想为状态添加一个thrr列吗?您可以通过查询轻松地检查状态,您看过小提琴上的演示吗?请看最后一个查询。啊,对不起,我还没有试过这个链接。这是一个简洁的小工具:)据我所知,它看起来像每个对象,你可以指出它有一个属性,或者你可以把它留空。但实际上,我认为我需要保持所有三种可能的状态:is-a、is-not-a和unknown。随着信息的收集,未知数将逐渐转化为is-a或is-not-a。可能有一些未知的东西是没有人知道如何填写的。你能回答我的问题“与很多行相比,有很多列是不好的吗?”?从我读到的内容来看,似乎没有人希望有很多列,但数千行就可以了。是真的吗?对不起。。。因为我没有计划在SQL项目之外再安排时间,所以我不可能太深入。我也无法想象如何为每个对象获取一批表,然后查询它们以查看哪些对象具有特定属性。(也许这是可能的,但我确实不知道怎么做:))看起来我想把它们关联到一个表中,然后查询它。