C #: Как бы вы хранили произвольные объекты в SQL Server? - PullRequest
3 голосов
/ 13 июля 2009

Допустим, у вас есть различные объекты произвольного типа, которые вы хотели бы сохранить в таблице типа ключ + значение. Ключ может быть, например, int, string или guid. Какова будет стоимость? String, Binary или что-то еще?

А как бы вы хранили и загружали объекты? Я бы подумал, что это какая-то сериализация, но какая?


В настоящее время у меня есть одно решение, где у меня есть класс с этими двумя методами:

public T Get<T>(string key)

public void Set<T>(string key, T value)

В базе данных у меня есть таблица со строковым столбцом и двоичным столбцом. Затем я использую BinaryFormatter для сериализации и десериализации значения и Linq2Sql для помещения двоичного результата в таблицу базы данных. Но это хорошее решение? В настоящее время я только посмел попробовать это с простыми значениями, такими как целые и строки Как BinaryFormatter и сериализация в целом работают с более сложными типами, такими как структуры и классы? Особенно, если, например, значение содержит такие вещи, как массивы или списки.

Есть указатели?


В данный момент я буду использовать его для хранения различных значений типа последний выбранный или набранный и т. Д. Хотя они не всегда могут быть напечатаны. Например, это может быть выбор значений из списка. Суть в том, что они в значительной степени будут просто удобством для пользователя, поэтому не очень важные данные.

Ответы [ 3 ]

6 голосов
/ 13 июля 2009

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

Существует множество различных вариантов сериализации. Основными являются, конечно, BinaryFormatter и XmlSerializer; XML гораздо более переносим, ​​но за счет места. Я считаю, что он также менее настраиваемый.

Существуют сторонние технологии сериализации, такие как Thrift и Буферы протокола . Они будут более ограничительными с точки зрения того, что они могут сериализовать), но будут более переносимыми. (Отказ от ответственности: мой 20% проект - это C # порт протокольных буферов, поэтому я здесь не совсем беспристрастен.)

Вам также следует рассмотреть возможность создания версий - что вы хотите, чтобы произошло, если вы измените структуру данных, которую сериализуете / десериализуете? Может быть, вам не нужно уметь читать «старые» записи, может быть, вы делаете. Возможно, вам нужен старый код, чтобы читать «новые» записи, или нет.

Ваш выбор технологии должен определяться требованиями. Чем более общим вы пытаетесь это сделать, тем сложнее оно становится - поэтому решайте, что вам действительно нужно, прежде чем пытаться найти решение.

1 голос
/ 13 июля 2009

Когда мы это сделали, мы сохранили данные в байтовом массиве в C # и сохранили их в столбце varbinary (max) в SQL Server.

РЕДАКТИРОВАТЬ На основании комментария

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

0 голосов
/ 13 июля 2009

Обычно я использую определенный столбец для определенного типа значения.

Например.

  • Guid: UNIQUEIDENTIFIER
  • чисел, таких как int, decimal, byte и т. Д .: DECIMAL
  • string: NVARCHAR
  • DateTime: DATETIME

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

create table dbo.Value (
  Name NVARCHAR(80) not null,
  Type NVARCHAR(6) not null,
  TextValue NVARCHAR(500) null,
  GuidValue UNIQUEIDENTIFIER null,
  NumericValue DECIMAL(36, 18) null,
  DateTimeValue DATETIME null
)

Тип столбца: «TEXT», «GUID», «NUMBER» или «DATE». Это все сделано NHibernate, но может легко использоваться и управляться без него.

Кроме того, вы можете сохранить ссылку на другую сущность, используя в качестве значения тип NH any (сохраняя первичный ключ и имя сущности).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...