Дизайн Mysql для пользователя с несколькими элементами данных

#mysql #database-design

#mysql #database-design

Вопрос:

Я хочу хранить заметки, закладки, видео и изображения, принадлежащие пользователю:

Упрощенная пользовательская таблица выглядит следующим образом:

 user: id, email, password_hash
  

Заметка содержит заголовок и содержимое, тогда как закладка содержит заголовок и URL

 note: id, title, content, (user_id)
bookmark: id, title, uri
video: id, title, uri
images: id, title, uri
  

Я мог бы создать таблицу для всего этого, однако, если бы я хотел добавить что-то еще, например задачи, мне пришлось бы создать для этого другую таблицу. Как вы предлагаете мне создавать таблицы?

Является ли mysql лучшей базой данных для этого, или что-то вроде mongodb было бы лучше?

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

1. Не могли бы вы иметь одну таблицу с id, title, content и user_id , с content в качестве общего поля? Затем добавьте другое поле, определяющее тип содержимого, которое определяет строка.

2. Какова область уникальности title — глобально уникальная, уникальная для каждого типа контента, уникальная для каждого пользователя или уникальная для комбинации пользователя и типа контента? Будут ли какие-либо поля url , кроме содержимого? Используете ли вы InnoDB (поэтому кластеризация является проблемой)? Вам нужна возможность указывать новые типы контента без изменения модели базы данных?

3. a) уникальный для каждого типа контента, b) временная метка, удаленная (bool) c) Нет, я не использую InnoDB.

4. @johnmossel Будут ли когда-нибудь разные поля для разных типов контента? Кроме того, может ли контент использоваться совместно пользователями (например, двумя пользователями, имеющими одинаковое изображение)?

5. Нет пользователей, которые не могут делиться. Содержимое — это либо URI, либо текст.

Ответ №1:

Как предполагает JamWaffles, у вас может быть одна таблица для содержимого и одна для типов содержимого, т. е.:

 content: id, title, uri, content_type_id, user_id
content_type: id, name
  

РЕДАКТИРОВАТЬ: таблица содержимого может выглядеть следующим образом:

 -------------------------------------------------------------
| id |   title   |     uri      | content_type_id | user_id |
-------------------------------------------------------------
| 1  | 'My note' | '/note?id=1' |        4        |    56   |
-------------------------------------------------------------
  

И таблица типов содержимого:

 ---------------
| id |  name  |
---------------
| 4  | 'note' |
---------------
  

На самом деле я не использовал MongoDB, но, полагаю, вы могли бы использовать следующую структуру:

 {
  "id": "...",
  "email": "...",
  "password_hash": "...",
  "notes": {
    "id": "...",
    "title": "...",
    "uri": "..."
  }
  "bookmarks": {
     ...
  }
}
  

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

Я надеюсь, что это поможет,
согласно Flitig
Netlight Consulting

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

1. Что тогда происходит с содержимым заметки? Должен ли я создать для этого отдельную таблицу?

2. В случае с mysql у вас будут примечания в таблице content . Примером строки в content может быть {123, 'My note', '/note?id=1', 4, 56} соответствующая строка в content_type , {4, 'note'}