0

Я пытаюсь найти разумную схему базы данных SQLite для следующей ситуации.Моделирование публикации с несколькими авторами, принадлежащими нескольким instutes в SQLite

У меня есть база данных, содержащая публикации. В каждой из этих публикаций есть ряд авторов, и каждый из этих авторов может принадлежать нескольким различным институтам. Возможно, однако, что несколько авторов разделяют институт. Например, в публикации есть авторы Энн, Берт и Карл. Anne принадлежит институтам A и B, Bert принадлежит B и C, а Carl принадлежит C, D и E.

Число авторов в публикации должно быть переменным, равно как и количество институтов любого конкретного автора может принадлежать к. Однако институты должны быть представлены только один раз.

Прямо сейчас, я имею в виду следующую схему:

create table publications (
    id integer primary key autoincrement, 
    ... 
) 

create table publication_institutes (
    id integer primary key autoincrement, 
    publication_id integer references publications(id), 
    ... 
) 

create table publication_authors (
    id integer primary key autoincrement, 
    publication_id integer references publications(id), 
    ... 
) 

create table publication_author_institute (
    id integer primary key autoincrement, 
    institude_id integer references publication_institutes(id), 
    author_id integer references publication_authors(id) 
) 

Это кажется неоптимальным, хотя. publication_author_institute больше не ссылается на идентификатор в publications, но его явно не видно.

Есть ли ясное решение этой ситуации?

Заранее благодарен!

+0

Вы хотите знать, к каким учреждениям принадлежит автор, или к которым он принадлежал при публикации конкретной публикации? –

+0

Мне нужно знать, какие авторы принадлежат к определенной публикации, а также к тому институту, в котором они принадлежали при публикации этой публикации. Несколько авторов могут принадлежать одному и тому же институту для данной публикации. –

ответ

0

Я бы пошел со схемой, в которой есть авторы, публикации и институты, а затем таблицы «многие ко многим» для отношений между авторами и авторами к публикациям.

Например:

author 
id name  other info (lastname, title, etc) 
1 Anne  ... 
2 Bert  ... 
3 Carl  ... 

institute 
id name other info (address, city, state, etc) 
1  A  ... 
2  B  ... 
3  C  ... 
4  D  ... 
5  E  ... 

publication 
id title   journal   year issue 
1 How to Publish Weekly Journal 2011  5 
2 What I Do  Monthly Mag  2013  1 
3 How Are We  Ranger Rick  2014  9 

author_affiliation 
id author_id inst_id 
1  1   1 
2  1   2 
3  2   2 
4  2   3 
5  3   3 
6  3   4 
7  3   5 
(for this table, could also use author_id-inst_id as a composite PK, 
and get rid of the id column, as in the next table) 

publication_author (here i'm using the composite PK) 
pub_id auth_id position 
    1   1   1 
    1   2   2 
    2   1   2 
    2   3   1 
    3   3   1 
(position indicates order of authorship, which is important) 

В конечном счете, это делает ведение базы данных проще, как изменение принадлежности просто требует капельной запись из таблицы author_affilitation, без необходимости внесения каких-либо изменений в институт или записи автора. Для публикаций вам нужно будет ввести запись как для публикации, так и для публикации_автора, но это позволяет избежать столкновений с несколькими значениями (например, столбец «авторы» в таблице публикаций).

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

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

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