您好我正在通过在网站上工作来学习烧瓶,我遇到了一个我似乎无法弄清楚的问题。
我想尝试创建一对多通过主键连接的表。这个想法是用户可以创建一个角色,如果类型是原始的,我可以调出原始表并根据他们的id显示角色。
我的问题是:这是否可能,如果是这样,我应该这样做,还是根据谁创建角色而不是他们的身份来连接它们?
这是我想要做的事情的图表:
答案 0 :(得分:0)
这是否可行,如果是这样,我应该这样做或者这样做 根据创建角色的人而不是他们的角色来连接它们 ID?
这是可能的,您也可以根据创建者连接它们。
根据数据的含义以及您要实现的目标,有许多可能性。我在下面列出3
您可以创建一个包含所有三个连接的视图。如果您有一个仅在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
这里的问题是,数据库中很难强制执行约束,确保三个表中只有一个引用任何单个字符记录。您必须在应用程序中强制执行此约束。
您还可以以不同方式设置表格。如果引用字符表的所有三个表都具有相同的字段,那么您可以将它们组合到一个表中,并且具有可能值为(Original,Fandom,Dungeon)的类型字段。
Combined Table
- id
- commonField1
- commonFieldN
- Type (possible choices: Original, Fandom, Dungeon)
如果这些表没有完全相同的字段,那么您可以使用多个记录来组成一个实体。例如
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
在任何情况下,名称等创建者的详细信息都应该在他们自己的表中,并在所有其他表中都有引用。这些数据不应该像目前那样在所有表格中重复。