Я использую таблицу БД с различными объектами. Это означает, что я не могу иметь произвольное количество полей в нем, чтобы сохранить все виды различных объектов. Вместо этого я хочу сохранить только самые важные поля (даты, идентификаторы ссылок - вид внешнего ключа для различных других таблиц, наиболее важные текстовые поля и т. Д.) И дополнительное текстовое поле, в котором я хочу хранить более полные данные объекта.
самое очевидное решение - использовать XML
строки и хранить их. Вторым наиболее очевидным выбором будет JSON
, который обычно короче и, вероятно, также быстрее сериализуется / десериализуется ... И, вероятно, также быстрее. Но так ли это на самом деле? Мои объекты также не должны быть строго сериализуемыми, потому что JsonSerializer обычно может сериализовать что угодно. Даже анонимные объекты, которые также могут быть использованы здесь.
Что было бы наиболее оптимальным решением для решения этой проблемы?
Дополнительная информация
Моя БД сильно нормализована, и я использую Entity Framework, но в целях обеспечения внешней сверхбыстрой функциональности полнотекстового поиска я пожертвую немного денормализацией БД. Просто для информации я использую SphinxSE поверх MySql. Sphinx будет возвращать идентификаторы строк, которые я буду использовать для быстрого запроса к моей конгломератной таблице, оптимизированной по индексу, для получения наиболее важных данных из нее гораздо быстрее, чем для запроса нескольких таблиц по всей моей БД.
Моя таблица будет иметь такие столбцы, как:
RowID
(автоинкремент)
EntityID
(фактической сущности - но не имеет прямого отношения, поскольку это должно указывать на разные таблицы)
EntityType
(чтобы я мог получить реальную сущность при необходимости)
DateAdded
(запишите метку времени, когда она была добавлена в эту таблицу)
Title
Metadata
(сериализованные данные, относящиеся к конкретному типу сущности)
Эта таблица будет проиндексирована с помощью индексатора SPHINX. Когда я буду искать данные с использованием этого индексатора, я предоставлю серию EntityIDs
и дату ограничения. Индексатору придется возвращать очень ограниченную выгружаемую сумму в RowIDs
, упорядоченную по DateAdded
(по убыванию). Затем я просто присоединю эти RowIDs
к моей таблице и получу соответствующие результаты. Так что на самом деле это будет не полнотекстовый поиск, а поиск с фильтрацией. Таким образом, получение RowIDs
будет очень быстрым, а получение результатов из таблицы будет намного быстрее, чем сравнение EntityIDs
и DateAdded
сравнений, даже если они будут правильно проиндексированы.