Я храню разные предметы (заметки, статьи, рисунки, файлы) в одной таблице (для всех типов элементов есть много метаданных - например, категории, теги, рейтинг, статистика и т. д.).Отдельная таблица для элементов изображения с полем изображения
Мой первый проект был так: таблица Элементы, плюс еще "деталь" таблица для каждого из типов элементов (NoteItems, ArticleItems, PictureItems и т.д.). Чтобы получить один элемент, таблицы должны быть соединены друг с другом (SELECT * FROM Items INNER JOIN PictureItems ON Items.Id = PictureItems.Id WHERE Items.Id = N).
Я уверен, что этот «по-книжный» дизайн будет работать красиво (сделано несколько раз), однако я начинаю задаваться вопросом, является ли дизайн излишним. Было бы намного проще иметь одну таблицу (Элементы).
Предположим, что существует около 5% элементов изображения или типа файла.
И теперь вопрос: если я пойду для (почти) одного стола, было бы лучше иметь таблицы подробностей для полей изображений в любом случае (например, для изображений и файлов)?
Сценарий 1: только одна таблица: Элементы (для хранения заметок, статей, фотографии, файлы ...)
Сценарий 2: две таблицы: Элементы (для хранения заметок, статей, графических файлов), ImageItems (для хранения только поля изображения типов элементов изображения, файла); один-к-одному отношение
(сценарий 3 будет незначительные изменения в сценарии 2, с 3 таблицы (пункты, PictureItems, FileItems))
Преимущества сценария 1 являются:
- проще выберите запросы (нет соединения)
- транзакций менее обновления (только одна таблица обновляется на INSERT/UPDATE)
- производительности, масштабируемости из-за транзакционных меньше обновлений?
Преимущества сценария 2 являются:
- чистящая
- низкое потребление данных (в сценарии 1, около 95% от предметов другого типа, чем изображение или файл будет иметь нулевое значение в поле изображения, то есть около 16 байт впустую для указателя)
Какой сценарий вы выбрали бы: 1 (без транзакций) или 2 (более низкое потребление данных)? Спасибо за ваше мнение.
Мы здесь работаем над случаем, когда содержимое файла хранится в полях базы данных, не так ли? Вы когда-нибудь сохраняли имена файлов (и, в конечном итоге, pathes) в своей базе данных? – 2008-12-02 09:49:49
Обычно я не ставил двоичные данные в базу данных. Пути отлично работают. – 2008-12-03 17:33:36