【问题标题】:Django PostgreSQL database table design, foreign keys, 1 to manyDjango PostgreSQL数据库表设计,外键,1对多
【发布时间】:2014-12-22 06:55:31
【问题描述】:

我的数据库中有 4 个表。下图显示了带有红色框的表格名称的行和列。一共4张桌子。我是否正确地进行关系设计?这是一个测试项目,我强烈假设我将使用 JOIN 在一个表上获取整个数据集。我想非常正确地开始这个。

一个初学者的问题,但是发布者表(例如 Nintendo)有 4 行是否正常?

我正在使用 Django 1.7 和 PostgreSQL 9.3。我的目标是保持简单,有成长的空间。

【问题讨论】:

    标签: django postgresql database-design


    【解决方案1】:

    基本上你在这里得到了从后到前的关系......

    publisherdeveloperplatform 模型中的每个模型都有 game_id(即 ForeignKey 关系)...但这意味着这些实体中的每一个都只能与一个 单个 游戏。我很确定这不是你想要的。

    你需要它的另一种方式...而不是在game模型上放置三个外键,publisherdeveloperplatform各一个。

    ForeignKey 就是所谓的many-to-one relation。在这个例子中,我认为你想要的是将“许多”游戏与“一个”发行商相关联。开发者和平台也一样。

    比如publisher表用Nintendo有4行正常吗?

    不,这就是为什么你把它倒过来的一个例子。每个发布者应该只有一行。

    【讨论】:

    • 我想明确一点,一个游戏可以有多个发行商,可以有多个开发者,可以有多个平台。你的解决方案能解决这个问题吗?
    • 在这种情况下,您需要ManyToMany 字段而不是ForeignKeyGame 模型上...您仍然只需要发布者表中的每个发布者的一行等docs.djangoproject.com/en/1.7/topics/db/examples/many_to_many
    • 只有游戏模型上的多对多?任何地方都没有外键了吗?嗯...例如,许多游戏可以有许多发行商。我说可以。大多数游戏只有 1 个发行商和 1 个开发者。我需要这个来允许所有例外。
    • 是的,ManyToMany 关系允许多个但可以没有或只有一个。 (阅读文档以了解其工作原理,ManyToMany 字段的底层实现实际上是一个额外的表,例如 gamepublisher,其中包含两个字段,每个字段的外键 gamepublisher... 但通常这个细节是隐藏的,你不需要直接与“通过表”交互)
    • 主要思想是game 表包含每个游戏的单行,publisher 表包含每个发布者的单行等...这称为'normalised' db schema。 ..从那里你应该在概念上绘制出每个模型之间需要什么类型的关系(一对一、一对多、多对一、多对多),这将决定什么类型的字段在哪个模型上
    【解决方案2】:

    是的,你说的有问题是正确的。

    首先,这些屏幕截图很难看懂,对于这个简单的例子,它们可以工作,但那不是正确的工具,拿起笔和纸,画一些关系图,想想架构中涉及的实体是什么他们的关系是什么,例如你知道你有发行商,他们可以发行游戏,所以在这个受限的例子中你有 2 个实体,gamepublisher,以及它们之间的关系 publish(在这种情况下如果您有一个游戏发行商,您可以在游戏上放置一个 fk,或者为多对多情况创建中介关系)。平台和游戏也一样,为什么要在游戏中放置 fk,如果 id 为 2 的游戏将在 nintendo 64 上发布会发生什么?您在所有实体中都犯了完全相同的错误。

    拿起任何关于数据库设计基础的书,也许它会帮助你推理你的上下文和未来的问题。

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2018-04-13
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多