2014-01-19 8 views
0

У меня есть бизнес-объект, называемый учебный год, который имеет флаги перечисления на данный момент:магазин JSON массив в JSON строку в базе данных

[Flags] 
public enum VisibleDayOfWeek : int 
{ 
    None = 0, 
    Monday = 1, 
    Tuesday = 2, 
    Wednesday = 4, 
    Thursday = 8, 
    Friday = 16, 
    Saturday = 32, 
    Sunday = 64 
} 

Для меня это являются объекты значений без идентификаторов они не получают дополнительную таблицу SQL , Это также было бы излишним.

Теперь я думал о сохранении этих видимых дней (которые пользователь может настроить) как значение int в базе данных. Он работает в настоящий момент, но чтение/запись в базе данных и чтение/запись этих значений в бизнес-объект, а выполнение интеграционных тестов с этими объектами - боль.

Поскольку у меня есть клиент javascript, который использует json-данные, я подумал сегодня, почему бы не сохранить json-массив, который я получаю из браузера напрямую как строка json в базе данных. Поэтому единственное, что мне нужно сделать, это json.parse на стороне клиента. А для выполнения интеграционных тестов на стороне сервера я использую существующие json.serialize/deserialize методы из моей json-библиотеки.

Видимые дни меняются в течение года только 1,2 или 3 раза не часто. На пользователя есть 5 школьных датаров за 5 лет, может быть, не намного больше. Столбец видимых дней никогда не будет запрашиваться через sql select. Логика пользовательского интерфейса выполняется на стороне клиента.

Так что для меня хорошая идея сохранить json-массив как строку json в базе данных sql.

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

+0

SQL не поддерживает JSON изначально, поэтому вы не можете напрямую запускать запросы к данным JSON. С другой стороны, SQL Server поддерживает запросы на основе XML и XML. Таким образом, вы можете захотеть сохранить преобразование JSON в XML для хранения. – wdosanjos

+0

Вы прочитали мой ВОПРОС или просто прочитали название? quote: «... Столбец видимых дней никогда не будет запрашиваться через sql select» – Elisabeth

+0

Если есть гарантия, что никогда не будет необходимости запрашивать эти данные, просто сохраните JSON в столбце varchar/nvarchar. Но я предлагаю сохранить ваше решение более открытым для будущих требований/улучшений, сохранив XML вместо этого. – wdosanjos

ответ

4

Причина не положить JSON в текстовом поле в реляционной базе данных:

  1. Вы теряете возможность делать запросы, которые зависят от данных в поле JSON.
  2. Поскольку вы не описываете свои данные для механизма SQL, ваш код приложения/сервера несет ответственность за проверку данных и гарантирует, что они могут вести себя, если данные будут повреждены.

Причины поставить JSON в текстовое поле в реляционной базе данных:

  1. Эффективность (JOIN может быть медленным, и если вы знаете, что вы никогда не должны запрашивать, используя данные в поле, вам не нужно хранить его таким образом, чтобы это можно было сделать).
  2. Упрощение внедрения (просто убедитесь, что вы проверяете (на сервере), что клиент дал вам действительную строку JSON).
+0

К вашему номеру 2. Я этого не сделаю. Функция JSON.Stringify сделает это.И если кто-то использует скрипач, чтобы отправить мне плохой json, сервер все равно не примет данные, потому что он не может его сериализовать. Это его работа. – Elisabeth

+0

@ Elisa I, что я мог предположить, что каждый, кто может прочитать этот ответ, этого не сделает. – ivarne

+0

В новом SQL Server вам не нужно беспокоиться о проверке JSON. Вы можете добавить ограничение JSON, которое проверяет правильность форматирования текста. –