База данных: несколько таблиц или только одна таблица?

For example У меня есть таблицы photos и videos, я могу комментировать их, но когда я отправляю их в базу данных, какой способ лучше?

  1. Иметь 2 таблицы для комментариев: photo_comments и video_comments

  2. Или иметь 1 таблицу comments и создать строку внутри таблицы, например type, и поместить туда, если это photo_comment или video_comment

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

Пожалуйста, дайте мне знать, как лучше всего, скорость очень важна для меня.

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


person Adam Halasz    schedule 11.07.2010    source источник
comment
Возможный дубликат: stackoverflow.com/questions/751831/designing-a-comment -таблица   -  person    schedule 11.07.2010
comment
Также стоит отметить, что скорость не является достаточно хорошим критерием проектирования. Вы должны указать, КАК вы собираетесь получать эти строки. Это система OLTP или система OLAP? Вы обычно загружаете эти записи по одной или часто сканируете целые таблицы?   -  person Dave Markle    schedule 11.07.2010
comment
@CIRK: это ничего не говорит о ваших шаблонах запросов или вариантах использования.   -  person Dave Markle    schedule 11.07.2010
comment
Do you usually load these records one at a time or do you often scan whole tables? Я думаю, что ответ на этот вопрос — в режиме реального времени.   -  person Adam Halasz    schedule 11.07.2010
comment
+1 за хороший и часто обсуждаемый вопрос.   -  person 2ndkauboy    schedule 12.07.2010
comment
+1 Дэйву за вопрос об OLTP и OLAP.   -  person Walter Mitty    schedule 09.02.2013
comment
@Адам. Подумайте еще раз. Пожалуйста, ответьте на вопрос. Вы ищете одну запись за раз или сканируете всю таблицу?   -  person Walter Mitty    schedule 09.02.2013


Ответы (6)


Почему бы не иметь только одну таблицу комментариев? Есть ли разница между комментарием к видео или фото? Если нет, у вас должен быть только столбец, содержащий внешний ключ для видео/фото, на который указывает комментарий, и дополнительный столбец с типом ENUM, который содержит информацию о типе ресурса, для которого предназначен комментарий.

Использование ENUM позволит выполнять ваши запросы очень быстро (поскольку сохраняется как число) и упрощает использование строки в вашем запросе.

person 2ndkauboy    schedule 11.07.2010
comment
Причина, по которой я бы взял одну таблицу: когда вы расширяете свою систему комментариев и вносите изменения в столбцы, вам нужно изменить только одну таблицу. Даже если эта одна таблица станет очень большой, она будет очень быстрой для получения результатов для видео/фото, если вы правильно используете индексы. У меня есть таблицы с более чем 20 миллионами записей, и поиск в них по-прежнему очень быстрый (менее 100 мс даже для очень сложных поисков), поэтому в этом случае размер не должен быть проблемой. И вы всегда можете разделить свою таблицу. - person 2ndkauboy; 11.07.2010
comment
Хм, кажется, я оставил поле «Длина/Значения» пустым. - person Adam Halasz; 11.07.2010
comment
Ваше предложение ENUM не является хорошей рекомендацией для производительности. Предложение использовать одну таблицу с этой существующей структурой таблиц также не является хорошим решением для поддержания и обеспечения ссылочной целостности. - person Dave Markle; 11.07.2010
comment
Использование INT может быть немного быстрее, но тогда вам придется документировать, какое число обозначает какой тип. Если реализация работает правильно, RI не должно быть проблемой. А как насчет поддержки 10 таблиц комментариев вместо одной таблицы? Где улучшение: у двух есть только одна таблица, если все комментарии имеют одинаковую структуру? Зачем таким системам, как программное обеспечение для ведения блогов, использовать только одну таблицу, если это такая плохая идея? - person 2ndkauboy; 11.07.2010
comment
Ребята, я говорю об очень большой системе с миллионами данных, миллионами комментариев, поэтому мне нужен самый быстрый способ получить результаты, для меня не имеет значения, нужно ли мне больше кодировать или нужно иметь в виду что-то в к тому же результат гораздо важнее! - person Adam Halasz; 11.07.2010
comment
Лучший способ получить быстрые результаты — кэшировать запросы с помощью чего-то вроде memcached (memcached.org). Чтобы оптимизировать свои запросы, вы должны опробовать свои запросы на больших наборах данных. Никто не может точно сказать вам, какой подход будет самым быстрым, не зная всей настройки вашей базы данных и настроек вашей базы данных, а также индексов и соединений, которые вы используете. - person 2ndkauboy; 11.07.2010
comment
@Kau: вы не можете создать ограничение внешнего ключа из двух таблиц в одну таблицу. Нет ничего плохого в использовании одной таблицы, но если вы собираетесь это сделать, вам нужно правильно нормализовать базу данных, используя шаблон супертипа/подтипа (см. мой ответ). Сказать, что RI не должно быть проблемой в качестве защиты от плохого дизайна, — это красный флаг. - person Dave Markle; 11.07.2010
comment
Это правда, но здесь вы пропагандируете наихудшую практику. -1. - person Dave Markle; 12.07.2010
comment
Хуже всего было бы не нормализовать какую-либо таблицу (например, хранить видео и фотографии в одной таблице). Но я вижу, вам нужно было найти смутную причину вашего отрицательного голосования. И эй, мой ответ был принят, так что я не ошибаюсь! Невозможно сделать это наилучшим образом во всех сценариях, и я просто указывал, как это можно сделать и поддерживать его в сопровождении. - person 2ndkauboy; 12.07.2010

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

Почему?

Если вы поместите все свои комментарии в одну таблицу comments, но которая ссылается на мультимедиа из двух отдельных таблиц данных, вы не сможете легко установить ссылочную целостность между вашей таблицей комментариев и двумя таблицами данных. Есть некоторые обходные пути (например, наличие двух отдельных полей ссылок, по одному для каждого), но ни один из них не является действительно убедительным. Отсутствие ссылочной целостности в конечном итоге приведет к «зомби-данным», которые не принадлежат ни к одной из существующих медиа-записей.

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

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

person marc_s    schedule 11.07.2010
comment
У меня не будет только photos и videos, у меня будут и другие штуки, так что делать для всего comment, хм, не знаю, а как насчет комментариев к комментариям? Я должен создать таблицы для них тоже? - person Adam Halasz; 11.07.2010

Это немного больше зависит от того, как структурированы фотографии и видео. Рассмотрим следующий дизайн БД:

MediaType
----------
ID *
Name

Media
----------
ID *
TypeID
OwnerName
Name
Size
Path

Photo
----------
MediaID *
MediaTypeID (constraint, always set to the photo type)
Height
Width

Video
---------
MediaID *
MediaTypeID (constraint, always set to the video type)
Rating

Если бы фото и видео имели FK для MediaType и Media, я бы сделал так, чтобы комментарии относились к таблице Media, а не к одной из них, а не непосредственно к таблице Photos или Videos. Я часто использую этот тип дизайна, когда фото и видео имеют много общих свойств. Это особенно полезно, когда вы хотите делать такие вещи, как безопасность, потому что вы не вынуждены повторять одни и те же конструкции видимости и владения для каждого типа носителя, с которым вы имеете дело. Кроме того, запросы выполняются довольно быстро, поскольку многие запросы часто ищут только общие свойства или только строки, относящиеся к определенному типу, поэтому некоторые таблицы не нужно включать. Проектирование базы данных путем моделирования этих отношений IS-A также обеспечивает высокую избирательность ваших индексов, что означает скорость.

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

person Dave Markle    schedule 11.07.2010
comment
Интересный способ, никогда такого не видел :) - person Adam Halasz; 11.07.2010
comment
Я также хотел бы убедиться, что MediaTypeID имеет ПК очень маленького размера. Я часто использую TINYINT или CHAR(1), чтобы размер индекса был компактным. Обратите внимание, что MediaID, MediaTypeID должны создаваться как составной внешний ключ. - person Dave Markle; 11.07.2010
comment
Для чего нужна Медиатаблица. Это абсолютно бесполезно и требует еще одного соединения, чтобы получить имя носителя. - person 2ndkauboy; 11.07.2010
comment
Медиа используется для общих свойств. Так как я не знаю структуру его базы данных, я просто оставил имя там. Это классический общепринятый способ реализации связи IS-A с реляционными базами данных. Часто вы начинаете замечать, что большинство свойств ваших таблиц Photo и Video на самом деле являются общими. Родительская таблица (например, Media) часто становится основной таблицей, из которой вы выполняете запросы в большинстве сценариев. - person Dave Markle; 11.07.2010
comment
@DaveMarkle, если бы мне также нужно было спроектировать структуру базы данных, вы бы предпочли создавать фото и видео с общей таблицей мультимедиа? мне кажется излишним запросы на объединение таблиц - person Dejell; 27.02.2017

Разделение таблиц было бы лучше с точки зрения производительности, поскольку вам не нужно было бы запрашивать дополнительный столбец «тип комментария». Недостатком такого подхода является отсутствие повторного использования кода (возможно, в будущем, если вы добавите комментарии к другим вещам). Но не похоже, что тебя это волнует.

person Jon Smock    schedule 11.07.2010
comment
Хм, хороший ответ, однако я думаю, что смогу добавить комментарии к другим вещам в будущем, потому что я могу создать новую таблицу, это не так сложно: P, но мой вопрос общий, я сделаю много вещей таким образом :) - person Adam Halasz; 11.07.2010

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

Вы должны выбрать тот, который имеет больше смысла в контексте вашего приложения.

Например, если комментарии к фотографиям и комментарии к видео будут действовать одинаково, у вас должна быть одна таблица, если, однако (например), комментарии к видео могут быть в два раза длиннее, чем комментарии к фотографиям, или комментарии на фотографиях есть дополнительное поле «рейтинг» или что-то в этом роде, тогда 2 таблицы будут иметь больше смысла.

person Justin    schedule 11.07.2010
comment
Для каждого типа контента комментарии будут одинаковыми, но я задал этот вопрос, потому что хочу убедиться, какой из них быстрее, у меня будет много вопросов скорости комментариев. - person Adam Halasz; 11.07.2010

ваши запросы будут выглядеть как

select * from comments where linked_id = 555

or

select * from comments where linked_id = 555 and comment_type = 1

(с типом комментария = 1, что означает, что это видео).

Пока тип комментария является индексом, они в основном будут такими же быстрыми.

Единственное, что я бы рассмотрел, это столбцы. Если в комментариях к видео набор комментариев отличается от комментариев к изображениям, разделите их. Если все одинаково, держите их вместе.

person bwawok    schedule 11.07.2010