Это он.
Например, у меня была запись в my strings.xml
:
<string name="A">Some text</string>
И в activity_main.xml
я использовал эту строковую запись
<TextView
android:id="@+id/textViewA"
android:text="@string/A"/>
Пока работал с проектом, я удалил это
<string name="A">Some text</string>
И, следовательно, activity_main.xml
стал недействительным. В результате: невозможно разрешить R.
Итак, проверьте свои файлы *.xml
и очистите проект.
Новый SQL Server предоставляет функции для обработки текста JSON. Информация, форматированная как JSON, может храниться как текст в стандартных столбцах SQL Server, а SQL Server предоставляет функции, которые могут извлекать значения из этих объектов JSON.
DROP TABLE IF EXISTS Person
CREATE TABLE Person
( _id int identity constraint PK_JSON_ID primary key,
value nvarchar(max)
CONSTRAINT [Content should be formatted as JSON]
CHECK ( ISJSON(value)>0 )
)
Эта простая структура похожа на стандартную коллекцию NoSQL, которую вы можно создавать в базах данных NoSQL (например, Azure DocumentDB или MongoDB), где у вас есть только ключ, представляющий идентификатор и значение, представляющее JSON.
Обратите внимание, что NVARCHAR - это не просто обычный текст. SQL Server имеет встроенный механизм сжатия текста, который может прозрачно сжимать данные, хранящиеся на диске. Сжатие зависит от языка и может достигать 50% в зависимости от ваших данных (см. Сжатие UNICODE).
Ключевое различие между SQL-сервером и другими обычными базами данных NoSQL заключается в том, что SQL Server позволяет использовать гибридную модель данных где вы можете хранить несколько объектов JSON в одной и той же «коллекции» и объединять их с регулярными реляционными столбцами.
В качестве примера представьте, что мы знаем, что каждый человек в вашей коллекции будет иметь имя FirstName и LastName, и что вы можете хранить общую информацию о человеке как о одном объекте JSON, а также о телефонных номерах / адресах электронной почты в качестве отдельных объектов. В SQL Server 2016 мы можем легко создать эту структуру без дополнительного синтаксиса:
DROP TABLE IF EXISTS Person
CREATE TABLE Person (
PersonID int IDENTITY PRIMARY KEY,
FirstName nvarchar(100) NOT NULL,
LastName nvarchar(100) NOT NULL,
AdditionalInfo nvarchar(max) NULL,
PhoneNumbers nvarchar(max) NULL,
EmailAddresses nvarchar(max) NULL
CONSTRAINT [Email addresses must be formatted as JSON array]
CHECK ( ISJSON(EmailAddresses)>0 )
)
Вместо единого объекта JSON вы можете упорядочить свои данные в этой «коллекции». Если вы не хотите явно проверять структуру каждого столбца JSON, вам не нужно добавлять ограничение проверки JSON для каждого столбца (в этом примере я добавил ограничение CHECK только в столбец EmailAddresses).
Если вы сравниваете эту структуру со стандартной коллекцией NoSQL, вы можете заметить, что у вас будет быстрый доступ к строго типизированным данным (FirstName и LastName). Поэтому это решение является хорошим выбором для гибридных моделей, где вы можете идентифицировать некоторую информацию, которая повторяется во всех объектах, а другая информация о переменных может храниться как JSON. Таким образом, вы можете сочетать гибкость и производительность.
Если вы сравните эту структуру со схемой таблицы Person AdventureWorks, вы можете заметить, что мы удалили много связанных таблиц.
Рядом простота схемы, ваши операции доступа к данным будут проще по сравнению с сложной реляционной структурой. Теперь вы можете читать одну таблицу вместо объединения нескольких таблиц. Когда вам нужно вставить нового человека со связанной информацией (адреса электронной почты, номера телефонов), вы можете вставить одну запись в одну таблицу вместо того, чтобы вставлять одну запись в таблицу AdventureWorks Person, используя столбец идентификатора, чтобы найти внешний ключ, который будет использоваться для хранения телефонов , адреса электронной почты и т. д. Кроме того, в этой модели вы можете легко удалить одиночную строку без каскадных удалений с использованием внешних ключей.
Базы данных NoSQL оптимизированы для простых операций чтения, вставки и удаления - SQL Сервер 2016 позволяет применять одну и ту же логику в реляционной базе данных.
Ограничения JSON В предыдущих примерах мы видели, как добавить простое ограничение, которое проверяет правильность форматирования текста, хранящегося в столбце. Хотя JSON не имеет сильной схемы, вы также можете добавлять сложные ограничения, комбинируя функции, которые считывают значения из JSON и стандартных функций T-SQL:
ALTER TABLE Person
ADD CONSTRAINT [Age should be number]
CHECK ( ISNUMERIC(JSON_VALUE(value, '$.age'))>0 )
ALTER TABLE Person
ADD CONSTRAINT [Person should have skills]
CHECK ( JSON_QUERY(value, '$.skills') IS NOT NULL)
First constraint will take the value of $.age property and check is this numeric value. Second constraint will try to find JSON object in $.skills property and verify that it exists. The following INSERT statements will fail due to the violation of constraints:
INSERT INTO Person(value)
VALUES ('{"age": "not a number", "skills":[]}')
INSERT INTO Person(value)
VALUES ('{"age": 35}')
Обратите внимание, что ограничения CHECK могут замедлить вашу вставку / обновление процессов, чтобы вы могли избежать их, если вам нужна более высокая производительность записи.
Сжатое хранилище JSON. Если у вас большой текст JSON, вы можете явно сжимать текст JSON с помощью встроенной функции COMPRESS. В следующем примере сжатый контент JSON хранится в виде двоичных данных, и мы вычислили столбец, который распаковывает JSON в качестве исходного текста с использованием функции DECOMPRESS:
CREATE TABLE Person
( _id int identity constraint PK_JSON_ID primary key,
data varbinary(max),
value AS CAST(DECOMPRESS(data) AS nvarchar(max))
)
INSERT INTO Person(data)
VALUES (COMPRESS(@json))
Функции COMPRESS и DECOMPRESS используют стандартное сжатие GZip. Если ваш клиент может обрабатывать сжатие GZip (например, браузер, который понимает содержимое gzip), вы можете напрямую возвращать сжатый контент. Обратите внимание, что это компромисс производительности / хранения. Если вы часто запрашиваете сжатые данные, у вас есть более медленная производительность, потому что текст должен каждый раз распаковываться.
Примечание. Функции JSON доступны только в SQL Server 2016+ и Azure SQL Database.
Подробнее можно прочитать из источника этой статьи
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/
Вопрос, который вы должны задать, это:
Я привязан к использованию только этой базы данных?
blockquote>DO
- Если вы можете использовать другую базу данных для хранения JSON, используйте решение для хранения документов, такое как CouchDB, DynamoDB или MongoDB.
- Используйте эти возможности DB хранилища документов для индексирования и поиска иерархических данных.
- Используйте реляционную базу данных для ваших реляционных данных.
- Используйте реляционную базу данных для отчетов, хранилищ данных и интеллектуального анализа данных.
НЕ НЕ
- Храните JSON в качестве строки, если это возможно.
- Попробуйте указать максимальную длину данных JSON.
- Используйте varchar для хранения JSON (используйте текст / blob, если вы must /.
- Попробуйте выполнить поиск в сохраненных JSON для значений.
- Беспокойство об экранировании JSON для хранения в виде строки.
Это слишком долго для комментария.
Если это было «абсолютно неправильно», большинство баз данных не поддержали бы его. Хорошо, большинство баз данных поддерживают запятые в предложении FROM
, и я считаю, что это «абсолютно неправильно». Но поддержка JSON - это новая разработка, а не обратная совместимость «функции».
. Один очевидный случай: структура JSON - это просто BLOB, который передается обратно в приложение. Тогда нет дебатов, кроме того, накладные расходы на хранение JSON, что излишне многословно для структурированных данных с общими полями в каждой записи.
Другим случаем является случай «редких» столбцов. У вас есть строки со многими возможными столбцами, но они варьируются от строки к строке.
Другой случай - это когда вы хотите хранить «вложенные» записи в записи. JSON является мощным.
Если JSON имеет общие поля для записей, на которые вы хотите запросить, тогда вам обычно лучше помещать их в соответствующие столбцы базы данных. Однако данные сложны и есть место для таких форматов, как JSON.
«Золотое правило», которое я использую в ручном режиме, заключается в том, что если мне нужен JSON в его необработанном формате, это нормально хранить. Если я должен сделать особую точку разбора, то это не так.
Например, если я создаю API, который отправляет raw JSON, и по какой-либо причине это значение не будет измените, тогда okay сохранит его как сырой JSON. Если мне нужно разобрать его, измените его, обновите и т. Д. ... тогда не так много.
Я буду махать волшебной палочкой. Пуф! Золотые правила использования JSON:
FULLTEXT
или SPATIAL
JSON не представляется возможным. WHERE a=1 AND b=2
«составной» индекс INDEX(a,b)
отлично; вероятно, не может приблизиться к JSON. BLOB
. Подумайте об этом как .jpg - там есть материал, но SQL все равно. Укажите ваше приложение; возможно, мы можем быть более конкретными.
Json's не очень хороши в отношениях db. Если вы разворачиваете json в столбцы и храните в db, это здорово, но хранить json, поскольку blob находится рядом с его использованием в качестве системы архивирования данных.
Может быть несколько причин не разворачивать json и хранить его в одном столбце, но решение было принято, поскольку значения в этом json-поле не будут использоваться для любого запроса (или значения имеют уже развернуты в столбцы).
Кроме того, большая часть обработки json, если вообще было задано поле, будет вне среды sql, поскольку sql просто не предназначен для обработки json. Тогда возникает реальный вопрос: где я храню этот json, я просто разрешаю ему быть плоскими файлами и, когда требуется, запрашивать их через какую-то другую систему (искра / улей / и т. Д.).
Я согласился бы с вашим художником БД, не используйте RDBMS для архивации. Есть более дешевые варианты. Кроме того, json blobs может стать огромным и начать со временем забивать дисковое пространство.