用三张桌子连接一对多?

时间:2016-05-29 14:13:13

标签: python mysql database sqlalchemy

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

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

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

这是我想要做的事情的图表:

Diagram

1 个答案:

答案 0 :(得分:0)

  

这是否可行,如果是这样,我应该这样做或者这样做   根据创建角色的人而不是他们的角色来连接它们   ID?

这是可能的,您也可以根据创建者连接它们。

根据数据的含义以及您要实现的目标,有许多可能性。我在下面列出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,这些表对您的Original,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

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