Как объединить две базы данных?

#sql #sqlite #android-room

#sql #sqlite #android-комната

Вопрос:

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

У меня есть следующие две базы данных

  1. Author где я сохраняю информацию об авторах Name Birthyear Country , Genre т. Е. , , и т.д.
  2. Book где я сохраняю информацию о книге, т. Е. AuthorName , ReleaseYear , Pages и т. Д

Как мне создать новую базу данных с полной информацией обо всех книгах и авторе? Т.е. Book_Complete Базу данных, которая включает Author.Name , ReleaseYear , Pages , Genre , ReleaseYear и Author.Birthyear , Author.Country ?

Комментарии:

1. Предположительно, у вас есть таблицы в одной базе данных, а не отдельные базы данных. Нет необходимости создавать новую «базу данных» или таблицу, когда достаточно простого запроса.

2. Почему вы хотите денормализовать свои данные? Почему бы просто VIEW не задать запрос или запрос, определенный в вашем приложении?

3. По сути, я создаю эти две таблицы в своем приложении и хочу сохранить объединенную версию на сервере. Или вы бы предложили другой подход?

4. База данных, состоящая из двух таблиц, как вы ее показываете, уже хороша. Однако вам придется подумать об отношениях. (В конце концов, для этого и нужна реляционная база данных.) Пожалуйста, прочтите мой ответ на это. Как есть, я вижу, что в таблице авторов есть жанр. Я полагаю, это их основной жанр? Если вы хотите работать с жанрами, вы, вероятно, захотите добавить таблицу жанров со всеми доступными жанрами и таблицу переходов, чтобы пометить каждую книгу одним или несколькими жанрами.

Ответ №1:

Лучше использовать одну базу данных и иметь в ней 2 таблицы, например

Author Table
AuthorID (PK)
Имя

Год рождения Страна Жанр

Book Table
BookID (PK)
AuthorID (FK)
Год выпуска
страниц

Комментарии:

1. Хотя я согласен, что они должны придерживаться двух таблиц, и хотя я считаю хорошей идеей работать здесь с суррогатными ключами (поскольку в противном случае будет сложно выбрать уникальный идентификатор для авторов), ваш ответ выиграет от того, что вы объясните, почему вы считаете, что это лучше.

Ответ №2:

Если у вас есть две таблицы в базе данных, вы можете объединить их с помощью JOIN . Вот руководство по использованию SQLite JOIN .

https://www.sqlitetutorial.net/sqlite-join/

На основе предоставленной вами информации я предполагаю, что вы можете использовать столбцы Name в таблице Author и AuthorName в таблице Book . Вы можете попробовать что-то вроде этого

 SELECT
  A.Name,
  B.ReleaseYear,
  B.Pages,
  B.Genre,
  B.ReleaseYear,
  A.Birthyear,
  A.Country
FROM
  Author A
  LEFT JOIN Book B
    ON A.Name = B.AuthorName
  

Ответ №3:

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

Да, мы бы. У вас должна быть одна таблица на объект, то есть одна для авторов и одна для книг. Таким образом, вы не сохраняете избыточные данные (например, имя автора или название книги), что в противном случае могло бы привести к несоответствиям позже. Вы можете прочитать о нормализации базы данных здесь: https://en.wikipedia.org/wiki/Database_normalization или погуглите это.

Теперь вы должны решить, как связать таблицы. Один автор может написать несколько книг. Может ли одна книга быть написана несколькими авторами? Укажите идентификаторы обеих таблиц, с которыми вы можете работать (или найдите какой-нибудь естественный уникальный ключ, например, ISBN для книги и, возможно, имя год рождения автора — одного имени, вероятно, будет недостаточно, и, возможно, его не будет даже в сочетании с годом).

Если одна книга может быть написана только одним автором, у вас есть отношение 1: n (одна книга написана одним автором, один автор пишет несколько книг).

  • автор (идентификатор автора, имя, год рождения_год, страна, …)
  • книга (book_id, название, author_id, release_year, страницы, …)

Если у одной книги может быть несколько авторов, у вас есть отношение m: n (одна книга написана несколькими авторами, один автор пишет несколько книг).

  • автор (идентификатор автора, имя, год рождения_год, страна, …)
  • книга (book_id, название, release_year, страницы, …)
  • book_author (book_id, author_id)

Вы всегда можете объединить таблицы, чтобы получить объединенный результат.