Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 一对一父数据库设计_Database_Entity Relationship_One To Many - Fatal编程技术网

Database 一对一父数据库设计

Database 一对一父数据库设计,database,entity-relationship,one-to-many,Database,Entity Relationship,One To Many,下面是一个代表我的问题的数据库设计(它不是我实际的数据库设计)。对于每个城市,我需要知道哪些餐厅、酒吧和酒店是可用的。我认为这两种设计不言而喻,但是: 第一个设计:在城市和餐馆、酒吧和酒店之间建立一对多的关系 第二个设计:只在城市和地方之间建立一对多的关系 哪种设计是最佳实践?第二种设计的关联性较小,但我是否能够获得一个城市的所有餐厅、酒吧和酒店,并且有自己的数据(财产_x/y/z) 更新:这个问题出了问题,可能是我不清楚的错。 餐厅/酒吧/酒店类是“地点”的子类 设计) 餐厅/酒吧/酒店类必

下面是一个代表我的问题的数据库设计(它不是我实际的数据库设计)。对于每个城市,我需要知道哪些餐厅、酒吧和酒店是可用的。我认为这两种设计不言而喻,但是:

第一个设计:在城市和餐馆、酒吧和酒店之间建立一对多的关系

第二个设计:只在城市和地方之间建立一对多的关系

哪种设计是最佳实践?第二种设计的关联性较小,但我是否能够获得一个城市的所有餐厅、酒吧和酒店,并且有自己的数据(财产_x/y/z)

更新:这个问题出了问题,可能是我不清楚的错。

  • 餐厅/酒吧/酒店类是“地点”的子类 设计)
  • 餐厅/酒吧/酒店类必须有家长“场所”
  • 餐厅/酒吧/酒店类有自己的特定数据(property_X/Y/X)

它们都有,但一个也没有


如果我需要选择一个,我会保留第二个,因为之后需要创建外键和索引的数量
但是,更好的方法是:创建一个包含各种场所(酒吧、餐厅等)的表,并为每一行指定一列,其中包含场所类型的值(应用一个COMPRESS子句,其中包含该列所需的类型)。它将提高结构的性能和可读性,并且更易于维护。

希望这有帮助。:-)

在任何子位置表中都不显示备用列。我认为不应该将类型数据拆分为“bar”、“restaurant”等表名——这些类型应该在place表中


我认为你应该有一个地址表,其中一列是城市。然后每个地方都有一个地址,你可以在需要时很容易地按城市分组。(或州或邮编或国家等)

我认为最好的选择是第二个。在第一种设计中,存在数据错误的可能性,因为一个地点可以分配给一个城市(例如a)的特定餐厅(或任何其他类型),同时可以分配给另一个城市(例如B)的另一家餐厅。在第二种设计中,一个地方总是与一个特定的城市相联系。

好的设计优先

您的数据,以及SQL和ED的<>强>可读性/可理解性>强是最重要的考虑因素。为了便于阅读:

  • city\u id
    放入
    place
    。原因:地方在城市里。酒店不是一个仅仅因为是酒店而恰好位于城市中的地方
其他设计要点要考虑的是这种结构将如何在未来扩展。让我们比较一下添加新的子类型:

  • 在design one中,您需要添加一个新表、与“地点”的关系和与城市的关系
  • 在设计2中,您只需将一个新表和关系添加到“place”
我还是选择第二种设计

性能秒

现在,我猜,但是将
city\u id
放在子类型中的原因可能是您预期在某些特定用例中它会更高效或更快,这可能是忽略可读性/可理解性的一个很好的理由。但是,在测量要部署的实际硬件的性能之前,您不知道:

  • 哪种设计更快
  • 性能上的差异是否会降低整个系统的性能
  • 其他优化方法(调优SQL或数据库参数)是否实际上是更好的处理方法
我认为design one是在ERD上对数据库进行物理建模的一种尝试,这是一种糟糕的做法

过早优化是软件工程中许多罪恶的根源

子类型方法

在ERD上实现子类型有两种解决方案:

  • 一个公共属性表,每个子类型一个表(这是第二个模型)
  • 包含子类型属性附加列的单个表
  • 在单表方法中,您将有:

    • 子类型列,
      类型INT NOT NULL
      。这指定行是餐厅、酒吧还是酒店
    • place
      上的额外列
      property\u X
      property\u Y
      property\u Z
    下面是一个简单的利弊表:

    单表法的缺点:

    • 单表方法上的扩展列(X、Y、Z)不能为NULL。您可以实现行级约束,但会失去简单NOTNULL的简单性和可见性
    • 单个表非常宽且稀疏,尤其是添加其他子类型时。您可能会达到某些数据库的最大列数。这会使这种设计相当浪费
    • 要查询特定子类型的列表,您必须使用
      WHERE TYPE=?
      子句进行筛选,而每个子类型的表是一个更自然的“FROM HOTEL internal JOIN PLACE ON HOTEL.PLACE\u ID=PLACE.ID”
    • 映射。
    单表方法的优点:

    • 通过合并到一个表中,没有联接,因此查询和CRUD操作更有效(但是这个小差异会导致问题吗?)
    • 对不同类型的查询是参数化的(
      其中TYPE=?
      ),因此在代码中比在SQL本身中更容易控制(
      从PLACE-INNER-JOIN-HOTEL-ON-PLACE.ID=HOTEL.PLACE\u-ID
    没有最佳设计,您必须根据SQL和CRUD操作的类型进行选择