#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'}