Простой ответ:
- Ссылочная целостность должна иметь
- Кэширование квалифицированный должен иметь
- Триггеры приятно иметь
Более длинный ответ
Я занимаюсь разработкой приложений для реляционных баз данных с 1993 года (декабрь RDB с тех пор, как вы об этом спросили, и для плоских файловых систем до этого), и триггеры никогда не пользовались популярностью у многих разработчиков, потому что они могут «удалять ненужные материалы удаление. Разработчики также часто осуждают ссылочную целостность, потому что базу данных в третьей нормальной форме с надлежащей ссылочной целостностью трудно объединить за несколько минут.
Кэширование также часто считают «трудным» для правильного выполнения, хотя я не уверен, почему.
Хотя многие системы могут жить без триггеров, я бы сказал, что ни одна база данных приложения не сможет комфортно выжить без ссылочной целостности. Посмотрите на теги по этому вопросу, в базе данных за этим сайтом будет таблица для тегов (вероятно, называемых «Tag») и вопросов (вероятно, называемых «Question»). «Вопрос» будет иметь внешний ключ к первичному ключу в таблице тегов, но, поскольку у вопросов может быть много тегов, а у тегов может быть много вопросов, я предполагаю, что отношения такие:
Question
(TagId) 1 | Database triggers / referential integrity and in-memory caching
|
-----
| | |
QuestionTag
(QuestionId) 1 | 1 ... 1 | 2 ... 1 | 3 ...
(TagId)
| | |
-----
|
Tag 1 | database ... 2 | referential-integrity ... 3 | triggers ...
(TagId)
Этот вид ссылочной целостности является основой любого надежного приложения и не подлежит обсуждению. Вы можете увидеть, как это добавляет доверия к дизайну приложения и уверенности в его долговечности.
Кэширование в SO может быть включено для такой вещи, как теги (хотя это не гарантировано), поэтому предположим, что теги кэшируются в памяти и у вас достаточно репутации, чтобы иметь возможность добавить тег в SO. Вы добавляете свой тег, и он вполне может быть сохранен в базе данных мгновенно - но обновляется ли тогда кэш?
То, что у вас есть, это компромисс. Может ли сайт выжить, не зная о вашем новом теге? И если да, то как долго? По сути, каков жизненный цикл тега, поскольку он постепенно добавляется пользователем в базу данных, доступную для других пользователей, которая используется другими пользователями? Кэш будет перестроен в соответствии с правилами, установленными командой разработчиков, и это правило будет компромиссом, так что любой новый тег будет доступен достаточно быстро без замедления работы приложения.
Триггеры могут обеспечивать ссылочную целостность, скажем, добавленный вами тег - «мусор», но к тому времени, когда администраторы увидят его, три вопроса будут помечены как «мусор». Затем администраторы решают удалить тег «мусор», но как быть с вопросами, которые помечены им? Если в таблице 'tag' есть триггер, который срабатывает при удалении, он может затем обойти таблицу 'question' и удалить все ссылки на 'мусор'. Есть много альтернатив этому подходу - многие из которых являются программными рабочими местами - но есть ли более чистая альтернатива?
За последние 20 лет я работал на многих сайтах, хорошие используют ссылочную целостность и все больше кешируют. Триггеры, которые изменяют данные анонимно (все, что они в основном представляют собой хранимые процедуры, управляемые событиями), не популярны и их все чаще неправильно понимают, но они по-прежнему играют роль.
Кэширование и ссылочная целостность не могут рассматриваться как одно или - команды разработчиков должны разрабатывать приложения так, чтобы оба они могли быть включены.