Обновление 2009.04.24
Главное в моем вопросе - не путаница разработчиков и что с этим делать.
Цель состоит в том, чтобы понять, когда правильные решения являются правильными.
Я видел данные с разделителями, используемые в коммерческих продуктовых базах данных (Ektron lol).
SQL Server даже имеет тип данных XML, поэтому его можно использовать с той же целью, что и поля с разделителями.
/end Обновление
В приложении, которое я разрабатываю, есть несколько отношений "многие ко многим". Раньше я часто использовал ассоциативные таблицы для их представления в базе данных. Это вызвало некоторую путаницу с разработчиками.
Здесь пример структуры БД:
Document
---------------
ID (PK)
Title
CategoryIDs (varchar(4000))
Category
------------
ID (PK)
Title
Между документом и категорией существует взаимосвязь "многие-ко-многим".
В этой реализации Document.CategoryID - это большой список идентификаторов категорий, разделенных по строкам.
Для меня это плохо, потому что для этого требуется использование подстроки в запросах, которые не могут использовать индексы. Я думаю, что это будет медленным и не будет масштабироваться.
С этой моделью, чтобы получить все документы для категории, вам понадобится следующее:
select * from documents where categoryids like '%|' + @targetCategoryId + '|%'
Мое решение - создать ассоциативную таблицу следующим образом:
Document_Category
-------------------------------
DocumentID (PK)
CategoryID (PK)
Это смущает разработчиков. Есть ли какое-то элегантное альтернативное решение, которое мне не хватает?
Я предполагаю, что в документе будут тысячи строк. Категория может быть примерно 40 строк. Основная проблема - производительность запросов. Могу ли я переоценить это?
Есть ли случай, когда он предпочитает хранить списки идентификаторов в столбцах базы данных вместо того, чтобы выталкивать данные в ассоциативную таблицу?
Учтите также, что нам может потребоваться создать отношения между многими из многих. Это предложило бы ассоциативную таблицу Document_Document. Является ли это предпочтительной конструкцией или лучше хранить связанные идентификаторы документов в одном столбце?
Спасибо.