2016-05-29 3 views
1

Привет, я изучаю флягу, работая на веб-сайте, и я столкнулся с проблемой, которую я не могу понять.Подключение одного ко многим с тремя таблицами?

Я хочу попытаться сделать таблицу для многих, которая соединяется через первичные ключи. Идея состоит в том, что пользователь может создать символ, и если этот тип является оригинальным, я могу отобразить оригинальную таблицу и отобразить символ на основе их идентификатора.

Мой вопрос: Является ли это возможным, и если да, то я должен делать это так или связать их на основе того, кто создал символ вместо своего идентификатора?

Это схема того, что я думал о попытке сделать:

Diagram

+0

Хотя вы уже приняли ответ (хотя мне было бы интересно узнать, какой из вариантов вы выбрали и почему), я думаю, вы должны серьезно подумать об использовании ['Находится на табличном наследовании'] (http: //docs.sqlalchemy. org/en/latest/orm/inheritance.html # join-table-inheritance) для этого варианта использования. – van

+0

Спасибо за ваш комментарий. Я не знал об этом ярлыке * Вводил наследование таблицы *. Согласитесь ли вы, что это может быть выполнено с возможностью 2 в моем ответе? – saq7

+0

Я думал о том, чтобы попробовать возможность 3, но я также посмотрю на Наставку для набранных таблиц! Спасибо. – geminateCoder

ответ

0

Возможно ли это и если да, я должен идти о делать это таким образом или соединив их на основе того, кто создал вместо символа ?

Возможно, и вы также можете подключить их на основе создателя.

В зависимости от того, что такое данные и чего вы пытаетесь достичь, существует ряд возможностей. Я перечисляю 3 ниже

Возможность 1

Вы можете создать вид и имеет все три соединения. Если у вас есть запись символа, которая указана только в таблице Fandom, то в представлении будут столбцы из таблиц Original и Dungeon равными null.

Это будет выглядеть немного, как это, для одного записи

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 

Вы можете заменить таблицу А и В выше, которые analgous к исходному, фэндома и таблиц 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 

В любом случае, детали создателя как имя, и т.д., должны быть в их собственной таблице со ссылкой на всех других таблиц. Эти данные не должны повторяться во всех таблицах, как в настоящее время.

Смежные вопросы