【问题标题】:Connecting a one to many with three tables?用三个表连接一对多?
【发布时间】:2016-09-27 09:54:19
【问题描述】:

您好,我正在通过在网站上工作来学习烧瓶,但遇到了一个我似乎无法弄清楚的问题。

我想尝试制作一个通过主键连接的一对多表。这个想法是用户可以创建一个角色,如果类型是原始的,我可以调出原始表并根据他们的 id 显示角色。

我的问题是:这可能吗?如果可以,我应该这样做还是根据谁创建角色而不是他们的身份来连接他们?

这是我想尝试做的图表:

Diagram

【问题讨论】:

  • 虽然您已经接受了答案(尽管我很想知道您选择了哪个选项以及为什么选择),但我认为您应该认真考虑在此用例中使用 Joined Table Inheritance
  • 感谢您的评论。我不知道标签 Joined Table Inheritance 的含义。您是否同意这可以通过我的回答中的可能性 2 来完成?
  • 我正在考虑尝试可能性 3,但我也会研究 Joined Table Inheritance!谢谢。

标签: python mysql database sqlalchemy


【解决方案1】:

这可能吗?如果可以,我应该这样做还是 根据谁创建角色而不是他们的角色来连接他们 身份证?

可以,也可以根据创建者进行连接。

根据数据的性质和您要达到的目标,有多种可能性。我在下面列出了 3 个

可能性 1

您可以创建一个包含所有三个连接的视图。如果你有一个单独在 Fandom 表中引用的角色记录,那么视图中 Original 和 Dungeon 表中的列将为空。

对于单个记录

,这看起来有点像这样
CharacterView
- Character.id - is not null 
- Character.creator - is not null
- Character.field1 - is not null
- Character.fieldN - is not null
- Original.id - is null
- Original.field1 - is null
- Original.fieldN - is null
- Fandom.id - is not null
- Fandom.field1 - is not null
- Fandom.fieldN - is not null
- Dungeon.id - is null
- Dungeon.field1 - is null
- Dungeon.fieldN - is null

这里的问题是很难在数据库中强制执行一个约束来确保三个表中只有一个表引用任何单个字符记录。您必须在应用程序中强制执行此约束。

可能性 2

您也可以以不同的方式设置您的桌子。如果引用字符表的所有三个表都具有相同的字段,那么您可以将它们组合到一个表中并具有一个类型字段,其中可能的值是(Original、Fandom、Dungeon)。

Combined Table
- id 
- commonField1
- commonFieldN
- Type (possible choices: Original, Fandom, Dungeon)

可能性 3

如果这些表没有完全相同的字段,那么您可以使用多条记录来组成一个实体。例如

TableA
- id 
- field1
- field2
- field3

TableB
- id 
- field4
- field5
- field6

您可以用一张表替换上面的表 A 和 B,它们与您的原始表、Fandom 和 Dungeon 表类似。如下图所示

TableC
- id
- entity_id (shared among all the records that make up one entity)
- char_id
- field_name (possible values field1, field2, ..., field6)
- value

在任何情况下,创建者的详细信息(如姓名等)都应该在他们自己的表中,并在所有其他表中引用。该数据不应像当前那样在所有表中重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2016-12-20
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多