В этой архитектуре ЦП работает с парами значений атрибутов

Обновлено: 03.07.2024

Синтаксис
ConfigurationPredicate :
ConfigurationOption
| КонфигурацияВсе
| КонфигурацияЛюбая
| ConfigurationNot

ConfigurationOption :
IDENTIFIER ( = (STRING_LITERAL | RAW_STRING_LITERAL)) ?

ConfigurationAll< /em>
все ( ConfigurationPredicateList ? )

ConfigurationAny
любой ( ConfigurationPredicateList ? )

ConfigurationNot
не ( ConfigurationPredicate )

ConfigurationPredicateList
< em>Предикат конфигурации
( , Предикат конфигурации) * , ?

Условно скомпилированный исходный код — это исходный код, который может считаться или не считаться частью исходного кода в зависимости от определенных условий. Исходный код можно условно скомпилировать с помощью атрибутов cfg и cfg_attr и встроенного макроса cfg. Эти условия основаны на целевой архитектуре скомпилированного контейнера, произвольных значениях, переданных компилятору, и нескольких других разных вещах, подробно описанных ниже.

Каждая форма условной компиляции использует предикат конфигурации, который принимает значение true или false. Предикат может быть одним из следующих:

  • Опция конфигурации. Значение true, если параметр установлен, и false, если он не установлен.
  • all() со списком предикатов конфигурации, разделенным запятыми. Ложно, если хотя бы один предикат ложен. Если нет предикатов, это правда.
  • any() со списком предикатов конфигурации, разделенным запятыми. Истинно, если хотя бы один предикат истинен. Если нет предикатов, это ложно.
  • not() с предикатом конфигурации. Оно истинно, если его предикат ложно, и ложно, если его предикат истинен.

Параметры конфигурации – это имена и пары "ключ-значение", которые либо установлены, либо не установлены. Имена записываются как единый идентификатор, такой как, например, unix. Пары ключ-значение записываются как идентификатор, = , а затем строка. Например, target_arch = "x86_64" — это параметр конфигурации.

Примечание. Пробелы вокруг = игнорируются. foo="bar" и foo = "bar" являются эквивалентными параметрами конфигурации.

Ключи не уникальны в наборе параметров конфигурации "ключ-значение". Например, оба параметра feature = "std" и feature = "serde" могут быть установлены одновременно.

Установить параметры конфигурации

Какие параметры конфигурации установлены, определяется статически во время компиляции ящика. Некоторые параметры устанавливаются компилятором на основе данных о компиляции. Другие параметры устанавливаются произвольно на основе входных данных, передаваемых компилятору вне кода. Невозможно установить параметр конфигурации из исходного кода компилируемого ящика.

Примечание. Для rustc произвольные параметры конфигурации задаются с помощью флага --cfg.

Примечание. Параметры конфигурации с ключевой функцией — это соглашение, используемое Cargo для указания параметров времени компиляции и необязательных зависимостей.

Предупреждение. Произвольно установленные параметры конфигурации могут иметь то же значение, что и параметры конфигурации, заданные компилятором. Например, можно выполнить rustc --cfg "unix" program.rs во время компиляции в цель Windows и одновременно установить параметры конфигурации unix и windows. На самом деле делать это неразумно.

target_arch

Опция "ключ-значение" задается один раз в соответствии с архитектурой целевого ЦП. Значение похоже на первый элемент целевой тройки платформы, но не идентично.

  • "x86"
  • "x86_64"
  • "мипс"
  • "мощный компьютер"
  • "powerpc64"
  • "рука"
  • "aarch64"

target_feature

Набор параметров "ключ-значение" для каждой функции платформы, доступной для текущей цели компиляции.

  • "avx"
  • "avx2"
  • "crt-static"
  • "рдранд"
  • "ссе"
  • "sse2"
  • "sse4.1"

Дополнительные сведения о доступных функциях см. в атрибуте target_feature. Дополнительная функция crt-static доступна для параметра target_feature, чтобы указать, что доступна статическая среда выполнения C.

target_os

Пара "ключ-значение" задается один раз в целевой операционной системе. Это значение аналогично второму и третьему элементам целевой тройки платформы.

  • "окна"
  • "макос"
  • iOS
  • "линукс"
  • "андроид"
  • "фрибсд"
  • "стрекоза"
  • "опенбсд"
  • "netbsd"

целевое_семейство

Пара "ключ-значение" предоставляет более общее описание цели, например семейство операционных систем или архитектур, к которым обычно относится цель. Можно задать любое количество пар ключ-значение target_family.

Unix и Windows

unix устанавливается, если задано target_family = "unix", и окна устанавливаются, если задано target_family = "windows".

target_env

Набор параметров "ключ-значение" с дополнительной информацией об устранении неоднозначности целевой платформы с информацией об используемом ABI или libc. По историческим причинам это значение определяется как не пустая строка только тогда, когда это действительно необходимо для устранения неоднозначности. Так, например, на многих платформах GNU это значение будет пустым. Это значение аналогично четвертому элементу целевой тройки платформы. Одно отличие состоит в том, что встроенные ABI, такие как gnueabihf, просто определяют target_env как "gnu" .

target_endian

Опция "ключ-значение" задается один раз со значением "маленький" или "большой" в зависимости от порядка байтов целевого ЦП.

ширина_целевого_указателя

Опция "ключ-значение" устанавливается один раз с шириной указателя цели в битах.

целевой_вендор

Пара "ключ-значение" задается один раз поставщиком цели.

Включается при компиляции тестового набора. Выполнено с помощью rustc с использованием флага --test. Дополнительные сведения о поддержке тестирования см. в разделе Тестирование.

отладочные_утверждения

Включен по умолчанию при компиляции без оптимизации. Это можно использовать для включения дополнительного кода отладки в разработке, но не в рабочей среде. Например, он управляет поведением стандартной библиотеки debug_assert! макрос.

proc_macro

Устанавливается, когда компилируемый крейт компилируется с типом крейта proc_macro.

Формы условной компиляции

Атрибут cfg

Синтаксис
CfgAttrAttribute :
cfg ( ConfigurationPredicate )

Атрибут cfg условно включает то, к чему он присоединен, на основе предиката конфигурации.

Он записывается как cfg , ( , предикат конфигурации и, наконец ) .

Если предикат истинен, вещь переписывается так, чтобы на ней не было атрибута cfg. Если предикат ложный, вещь удаляется из исходного кода.

Некоторые примеры функций:

Атрибут cfg разрешен везде, где разрешены атрибуты.

Атрибут cfg_attr

Атрибут cfg_attr условно включает атрибуты на основе предиката конфигурации.

Если предикат конфигурации имеет значение true, этот атрибут расширяется до атрибутов, перечисленных после предиката. Например, следующий модуль можно найти либо на linux.rs, либо на windows.rs в зависимости от цели.

В списке может быть ноль, один или несколько атрибутов. Каждый из нескольких атрибутов будет расширен в отдельные атрибуты. Например:

Атрибут cfg_attr разрешен везде, где разрешены атрибуты.

Макрос cfg

Встроенный макрос cfg принимает один предикат конфигурации и возвращает истинный литерал, если предикат истинен, и ложный литерал, когда он ложен.

Из этого важного руководства вы узнаете, как работают реляционные базы данных и чем они отличаются от других баз данных.

Что такое реляционная база данных?

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

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

Столбцами (или полями) для таблицы клиентов могут быть Идентификатор клиента, Название компании, Адрес компании и т. д.; столбцами для таблицы транзакций могут быть Дата транзакции, Идентификатор клиента, Сумма транзакции, Способ оплаты и т. д. Таблицы могут быть связаны на основе общего поля Customer ID. Таким образом, вы можете запросить таблицу, чтобы получить ценные отчеты, такие как сводная выписка о клиентах.

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

Что такое SQL?

Вы можете взаимодействовать с реляционными базами данных с помощью языка структурированных запросов (SQL), стандартного языка для взаимодействия с системами управления.SQL позволяет объединять таблицы с помощью нескольких строк кода, и большинство нетехнических сотрудников могут быстро освоить эту структуру.

С SQL аналитикам не нужно знать, где на диске находится таблица заказов, как выполнить поиск для поиска определенного заказа или как соединить таблицы заказов и клиентов. База данных компилирует запрос и вычисляет правильные точки данных.

Преимущества

Основным преимуществом подхода к реляционным базам данных является возможность создания значимой информации путем объединения таблиц. Объединение таблиц позволяет понять отношения между данными или то, как таблицы связаны. SQL включает в себя возможность подсчитывать, добавлять, группировать, а также комбинировать запросы. SQL может выполнять основные математические функции и промежуточные итоги, а также логические преобразования. Аналитики могут упорядочивать результаты по дате, имени или любому столбцу.

Эти функции делают реляционный подход самым популярным инструментом запросов в современном бизнесе.

Реляционные базы данных имеют ряд преимуществ по сравнению с другими форматами баз данных:

Гибкость

В SQL есть встроенный язык для создания таблиц, называемый языком определения данных (DDL). DDL позволяет добавлять новые столбцы, новые таблицы, переименовывать отношения и вносить другие изменения даже во время работы базы данных и выполнения запросов. Это позволяет изменять схему или способ моделирования данных на лету.

Уменьшенная избыточность

Реляционные базы данных устраняют избыточность данных. Информация для одного клиента отображается в одном месте — в одной записи в таблице клиентов. В таблице заказов нужно хранить только ссылку на таблицу клиентов. Практика разделения данных во избежание избыточности называется нормализацией. Разработчики прогрессивных баз данных обеспечивают нормализацию таблиц в процессе проектирования.

Простота резервного копирования и аварийного восстановления

Реляционные базы данных являются транзакционными — они гарантируют согласованность состояния всей системы в любой момент. Большинство реляционных баз данных предлагают простые варианты экспорта и импорта, что упрощает резервное копирование и восстановление. Этот экспорт может происходить даже во время работы базы данных, что упрощает восстановление в случае сбоя. Современные облачные реляционные базы данных могут выполнять непрерывное зеркальное отображение, благодаря чему потеря данных при восстановлении измеряется секундами или даже меньше. Большинство облачных сервисов позволяют создавать реплики чтения, например, в IBM Cloud Databases для PostgreSQL. Эти реплики чтения позволяют хранить копию ваших данных только для чтения в облачном центре обработки данных. Реплики также могут быть переведены в режим чтения/записи для аварийного восстановления.

Примеры реляционных баз данных

Многие продукты баз данных реализуют модель реляционной базы данных. Они либо используют базу данных SQL для обработки, либо могут, по крайней мере, обрабатывать операторы SQL для запросов и обновлений базы данных. Эти базы данных варьируются от небольших настольных систем до крупных облачных систем. Они могут быть с открытым исходным кодом и внутренней поддержкой, открытым исходным кодом с коммерческой поддержкой или коммерческими системами с закрытым исходным кодом. Вот некоторые из наиболее популярных:

Майкл

MySQL — это распространенная и простая в запуске база данных с малым объемом памяти/диска/ЦП. Он поддерживает все основные команды SQL, а также транзакции и производительность атомарности, согласованности, изоляции, долговечности (ACID). MySQL — это наиболее распространенная база данных, интегрированная с сайтами WordPress.

PostgreSQL

PostgreSQL также имеет открытый исходный код. Он предоставляет корпоративные функции, такие как безопасность, масштабируемость и поддержку большей автоматизации через интерфейс командной строки, а также прямой доступ через Интернет. PostgreSQL поддерживает хранимые процедуры — более сложный язык программирования, построенный на основе SQL. Команды могут использовать хранимые процедуры для извлечения, преобразования и загрузки данных между системами. Примеры этого варианта использования включают обработку страховых требований и обработку сложных заказов. Postgres также работает с qGIS (ссылка находится за пределами IBM) или Geo Server (ссылка находится за пределами IBM) для хранения и сохранения глобальной информации.

Db2 — это коммерческая реляционная база данных от IBM, которая имеет как облачную, так и локальную версию.

Реляционный и NoSQL

Базы данных NoSQL предоставляют способы хранения, поиска и извлечения данных, отличные от таблиц со связями. Вот несколько ключевых отличий:

Пары "ключ-значение"

Самой популярной формой базы данных NoSQL является простая пара "ключ-значение". Пары ключ-значение помещают все данные в одну таблицу. Ключ является уникальным элементом. Для сотрудников или клиентов ключом может быть адрес электронной почты. Для заказов это будет номер заказа. Поскольку каждый ключ уникален, пара "ключ-значение" может хранить все отношения в одной "таблице".

Доступность превыше согласованности

Когда компьютеры работают в сети, им неизменно приходится решать, отдавать ли приоритет стабильным результатам (где все ответы всегда одинаковы) или длительному времени безотказной работы, называемому "доступностью". Это называется «теорией CAP», что означает согласованность, доступность или устойчивость к разделам. Реляционные базы данных обеспечивают постоянную синхронизацию и согласованность информации. Некоторые базы данных NoSQL, такие как Redis, предпочитают всегда предоставлять ответ. Это означает, что информация, которую вы получаете из запроса, может быть неверной на несколько секунд — возможно, на полминуты. На сайтах социальных сетей это означает видеть старую фотографию профиля, когда самой новой всего несколько минут. Альтернативой может быть тайм-аут или ошибка. С другой стороны, в банковских и финансовых операциях ошибка и повторная отправка могут быть лучше, чем старая неверная информация.

Гибкие схемы

Хотя реляционные базы данных имеют предопределенный набор строк и столбцов, базы данных NoSQL структурированы больше как документ. Если вы знаете, где находится информация в документе, вы можете получить ее. Если материал все еще находится в документе, вы можете добавить другую структурированную информацию, не изменяя правила. Если все сделано правильно, исходные запросы будут по-прежнему работать, что упрощает расширение базы данных без формальных обновлений.

Другие форматы баз данных NoSQL включают базы данных документов, графиков и объектов. Более широкий термин для баз данных NoSQL — нереляционные.

Полное изложение различий между SQL и NoSQL см. в статье "Базы данных SQL и NoSQL: в чем разница?"

Реляционные и нереляционные базы данных

Некоторые примеры конкретных нереляционных баз данных включают следующее:

Редис

Redis — это обычная база данных NoSQL, часто используемая для хранения данных, о которых мы говорили ранее. Выполняя только один поиск и не используя объединения или отношения, а затем перемещая обработку в веб-браузер, Redis обеспечивает быстрый ответ. Время отклика может иметь решающее значение для современных веб-сайтов с высокой конкуренцией.

ЯнусГраф

JanusGraph — это база данных графов, предназначенная для хранения и обработки запросов к большим графам. Эти большие графы содержат сотни миллиардов ребер и вершин, хранящихся в многомашинном кластере. JanusGraph может поддерживать тысячи одновременных запросов и расширяться за счет нового оборудования. Тип данных, которые хранит JanusGraph, может подходить для анимации или аэродинамического моделирования.

МонгоБД

MongoDB — это база данных документов, в которой записи хранятся в виде свободно структурированных документов. Это может быть идеальным для хранения веб-страниц в виде документов, для каталога продуктов электронной коммерции или приложений для социальных сетей. Как и Redis, MongoDB отличается от реляционных моделей тем, что не стремится к совместимости с ACID.

etcd — это еще одно хранилище ключей и значений, которое обычно используется для данных конфигурации распределенных систем. Обычный вариант использования etcd — облачные серверы, которые масштабируются по мере необходимости и нуждаются в единой базе данных для информации о конфигурации.

Кролик

RabbitMQ — это очередь сообщений с открытым исходным кодом. Сообщение обычно представляет собой некоторый объем текста, структура которого определяется клиентом. Вместо записей с постоянным сроком хранения RabbitMQ позволяет одной системе помещать сообщения в очередь, чтобы другие приложения могли затем извлекать сообщения, когда захотят. Эта асинхронная отправка/вытягивание позволяет распределенным приложениям передавать сообщения.

Эластичный поиск

Elasticsearch – это система полнотекстового поиска, которая взаимодействует с веб-API. Это означает, что основная ценность — получение результатов. Весь веб-сайт может хранить себя в Elasticsearch. Найдите пару ключ-значение, и вы получите текст веб-сайта. Настоящая сила Elasticsearch заключается в том, что поиск позволяет веб-сайту добавлять точную и быструю кнопку поиска. Elasticsearch может быстро и эффективно искать любую большую текстовую структуру.

Полную информацию о различных типах доступных баз данных см. в разделе «Краткий обзор ландшафта баз данных».

Схемы базы данных

Схема базы данных — это структура, определенная на формальном языке. В SQL есть два формальных языка: язык определения данных (DDL) и язык манипулирования данными (DML).

Чтобы выбрать данные из таблицы, обновить или удалить их, программисты используют DML. Для работы с базой данных, а также для создания и определения таблиц и отношений они используют DDL или инструмент для создания DDL.

DDL включает такие команды, как CREATE , DROP , ALTER , COMMENT и RENAME . Первая команда DDL — CREATE TABLE. Эта команда определяет первичный ключ (который должен быть уникальным), поля, способ хранения данных в этих полях и любые другие ограничения для таблицы. После определения вы можете создать базу данных как комбинацию языка определения и DML для ВСТАВКИ строк в таблицы.

Вот пример команды DDL для создания таблицы сотрудников.Как вы увидите, схема может включать в себя необходимые столбцы, которые должны быть уникальными (ключ) и на которые должны быть ссылки в других таблицах.

В этом примере таблица должностей содержит описание каждой должности, описание и уровень должности. В отдельной таблице, таблице pay_grades, показана зарплата для каждого уровня работы. Целые числа — это целые числа; char(100) резервирует до ста символов для текста.

Что происходит, когда строка удаляется из таблицы заданий? DDL позволяет программисту указать, что делать в данном случае. Столбец в employee может автоматически обновляться до NULL , как в этом случае, или может быть установлен casecade delete . Например, если библиотека-филиал удаляется из-за закрытия, книги, которые она не передала, также могут быть удалены.

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

Лицензирование

С точки зрения лицензирования реляционные базы данных отличаются от баз данных с открытым исходным кодом по одному важному принципу:

  • Для установки баз данных с открытым исходным кодом не требуется никаких затрат, но они не предоставляют готовую коммерческую поддержку.
  • Коммерчески поддерживаемые базы данных включают определенный уровень поддержки, но они не могут устранить проблемы, связанные с законным использованием базы данных, например случайные удаления, вызванные ошибками, внесенными программистами.

Вы можете размещать реляционные базы данных в облаке, на локальных серверах, на настольных компьютерах, в частных облаках или даже на устройствах Интернета вещей (IoT), если вы соблюдаете условия лицензии.

Как создать реляционную базу данных

Для работы реляционной базы данных необходимы две вещи: само программное обеспечение базы данных и код языка определения данных (DDL) для ее создания.

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

В качестве альтернативы базы данных можно запускать в облаке. Базы данных в облаке автоматически настраиваются на высокую доступность. Это означает, что ваши данные реплицируются на нескольких участниках, и каждый участник находится в отдельной зоне доступности.

Если весь центр обработки данных выходит из строя, база данных остается в рабочем состоянии. Данные реплицируются между зонами, поэтому вы можете сохранить все данные и продолжить работу в случае сбоя. Кроме того, поставщик будет управлять улучшениями безопасности и обновлениями версий операционной системы и базы данных. Пользователи стекаются к облачным базам данных для готовой корпоративной безопасности, высокой доступности, онлайн-масштабирования и автоматического резервного копирования.

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

Один из вариантов — создать таблицу со столбцом, представляющим каждый атрибут; это подходит для объектов с фиксированным числом атрибутов, где все или большинство атрибутов имеют значения для большинства объектов. Однако в нашем случае мы получим записи, в которых большинство столбцов будут пустыми, поскольку атрибуты могут быть неизвестны или неприменимы.

Чтобы решить вышеуказанную проблему, вы можете применить модель EAV (сущность, атрибут, значение). Этот шаблон также известен под несколькими альтернативными названиями, включая модель «значение атрибута объекта» и «открытая схема».

В модели данных EAV в базе данных хранятся только непустые значения, где каждая пара атрибут-значение (или ключ-значение) описывает один атрибут данного объекта. Таблицы EAV часто характеризуются как "длинные и тонкие", где "длинные" относятся к нескольким строкам, описывающим объект, а "узкие" относятся к небольшому количеству используемых столбцов.

В этой статье мы рассмотрим модель EAV и ее реализацию, а также покажем реальные приложения, в том числе посмотрим, как Magento использует этот шаблон.

Сначала несколько заметок.

Атрибуты объекта хранятся в таблице с тремя столбцами: объект, атрибут и значение. Объект представляет собой описываемый элемент данных, например продукт или автомобиль.

Атрибут представляет данные, описывающие объект, например, у продукта будет цена, вес и многие другие характеристики.

Значение — это значение этого атрибута, например, наш продукт может иметь цену атрибута 9,99 фунтов стерлингов.Кроме того, значения могут быть разделены на основе типа данных, поэтому будут отдельные таблицы EAV для строк, целых чисел, дат и длинного текста. Разделение типов выполняется для поддержки индексации и позволяет базе данных выполнять проверки типов, где это возможно.

Разреженность атрибутов

В математике и информатике, если объект имеет лишь несколько атрибутов из потенциально большого числа, мы называем это "разреженной матрицей". Когда мы говорим о модели EAV, мы используем термин "разреженный" для описания атрибутов, большинство из которых не имеют значения.

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

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

В терминах базы данных объектом является товарный чек с такой информацией, как идентификатор транзакции, дата и время, местонахождение магазина и т. д. Каждая подробная строка в чеке соответствует записи в таблице строк продаж и содержит атрибут плюс одно или несколько значений.

В этом сценарии атрибутом является продукт, приобретенный покупателем. Значения: количество, цена за единицу, скидка и общая цена.

Приведенный выше пример иллюстрирует разреженность атрибутов (покупатель покупает только некоторые из доступных продуктов) и знакомит нас с новым термином: моделирование строк. Таблица смоделирована по строкам, где ряд фактов, описывающих объект, записывается в виде нескольких строк. Каждый новый набор фактов сохраняется в базе данных в виде дополнительных строк, а не дополнительных столбцов.

Моделирование строк — это стандартный метод моделирования данных при проектировании баз данных. Его следует использовать только при соблюдении следующих двух условий:

  • данные по конкретному объекту скудны
  • данные уязвимы для изменения

Моделирование строк не подходит там, где не существует разреженности и волатильности, в таком случае следует использовать традиционное моделирование столбцов.

Пример моделирования строк

В этом примере у нас есть три сущности: Продукт, Клиент и Счет. И Products, и Customers являются стандартными реляционными таблицами.

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

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

Таблица счета содержит основную информацию о событии продажи; клиент, дата и время, а также идентификатор счета. Затем каждый счет-фактура описывается строками, записанными в таблице invoice_lines. В каждой строке указано, какой продукт был куплен, цена за единицу и количество.

скриншот таблицы счетов и моделирования строк

EAV и моделирование строк

Дизайн Entity-Attribute-Value представляет собой обобщение моделирования строк. Это означает, что все типы фактов записываются в одну таблицу по всей базе данных, где таблица, смоделированная строками, является однородной по фактам, которые она описывает. Кроме того, тип данных столбца значений в таблице, моделируемой строками, предопределен, тогда как в таблице EAV тип данных значения зависит от атрибута, записанного в конкретной строке.

Выбрать наилучший подход к моделированию данных может быть сложно, но в качестве руководства рекомендуется использовать моделирование EAV вместо моделирования строк, когда:

  • Отдельные атрибуты различаются типами записанных данных (Да/Нет, числовые значения, строки). Это затрудняет хранение значений атрибутов в одной таблице при использовании моделирования строк.
  • Необходимо представить множество категорий данных, и их количество может колебаться. В то же время категории имеют очень небольшое количество экземпляров, даже если атрибуты не разрежены. Использование обычного моделирования в таком случае означало бы сотни таблиц с очень небольшим количеством строк.
  • В определенных типах сред, где категории/классы необходимо создавать на лету, а некоторые классы часто исключаются в последующих циклах прототипирования.
  • Где есть категории, классифицируемые как гибридные, что означает, что некоторые атрибуты класса не являются запасными, а другие атрибуты сильно разрежены. В этой ситуации неразреженные атрибуты хранятся в обычной таблице, а разреженные атрибуты хранятся в формате EAV или в формате строк.Классы обычно встречаются в приложениях бизнес-баз данных, где описания продуктов зависят от категории продуктов, но все продукты имеют общие атрибуты, такие как единица упаковки и стоимость за единицу. Обратите внимание, что если есть только один или два гибридных класса, дизайн EAV может быть бесполезен.

Представление сущностей, атрибутов и значений

Представление объектов

Сущностью может быть любой товар, до сих пор мы видели примеры, когда сущностью были событие продажи, продавец и продукт. Сущности в EAV управляются с помощью таблицы объектов, в которой фиксируются общие факты о каждом элементе, такие как имя, описание и т. д. Таблица Objects должна иметь уникальный идентификатор для каждого объекта, который обычно генерируется автоматически. Затем идентификатор используется в базе данных как внешний ключ.

Моделирование EAV не мешает нам использовать обычные таблицы для получения дополнительных сведений об отдельных объектах. Обычно в рамках одной и той же схемы базы данных используются традиционные подходы к моделированию реляционной базы данных и моделированию EAV.

Представление атрибутов

Атрибуты хранятся в специальной таблице атрибутов. Первичный ключ этой таблицы используется в качестве ссылки в базе данных. Таблица атрибутов обычно дополняется несколькими таблицами метаданных, которые более подробно описывают атрибут. Эта информация метаданных часто используется для автоматизации создания пользовательских интерфейсов для просмотра и редактирования данных. Таблицы метаданных могут содержать некоторые из следующих типов информации:

  • Проверка. Метаданные проверки включают в себя тип данных атрибута, значение по умолчанию, ограничения на количество возможных значений и может ли значение быть нулевым.
  • Представление: определяет способ представления атрибута пользователю, будь то текстовая область, раскрывающийся список или набор переключателей/флажков.
  • Группировка. Атрибуты чаще всего представляются пользователю группами. Группировка метаданных определяет порядок отображения атрибутов, количество представленных атрибутов и используемый тип шрифта или цвета.
  • >Диапазон нормальных значений: В некоторых ситуациях также сохраняются диапазоны нормальных значений. Они могут различаться в зависимости от пола, возраста и т. д.

Представление значений

Самое простое решение для представления данных в модели EAV – сохранить их в виде строки. Однако этот подход относительно неэффективен, поскольку требует преобразования типов данных при любых действиях со значениями. Кроме того, индексы значений, хранящихся в виде строк, не позволяют оптимизировать поиск по диапазону для числовых типов и типов даты; это распространенная проблема при работе с парами ключ-значение данных смешанных типов данных.

Чтобы исправить эту ситуацию, в модели EAV используются отдельные таблицы для каждого типа данных. Метаданные атрибутов идентифицируют правильный тип данных и, следовательно, таблицу EAV, в которой хранятся данные. Этот подход намного эффективнее, поскольку позволяет кэшировать метаданные для заданного набора атрибутов в форме до доступа к данным.

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

Как правило, значения, которые пусты или не относятся к этому объекту, не сохраняются в модели EAV. Однако в некоторых случаях необходимо записывать причины отсутствия значений. В таких случаях решение состоит в том, чтобы добавить в таблицу столбец кода отсутствующего значения, который не равен нулю, только если столбец значения имеет значение null. Затем этот код используется для поиска списка текстовых пояснений.

Пример EAV

скриншот EAV с тремя таблицами: сущность, атрибут и значение

Однако в такой реализации мы теряем информацию о метаданных, и все значения сохраняются как varchar, независимо от их типа данных. В качестве варианта этого подхода мы можем альтернативно реализовать строго типизированный подход, при котором значение заданного типа данных записывается в таблицу, специфичную для этого типа данных. Пример схемы показан ниже и включает в себя хранилище метаданных, о котором мы говорили ранее.

снимок экрана с примером схемы, включающей хранилище метаданных

Как Magento использует модель EAV

В сообществе с открытым исходным кодом и php одна из самых известных реализаций модели EAV находится в Magento, платформе электронной коммерции. Давайте начнем с рассмотрения схемы базы данных Magento. Хотя сначала это может показаться сложным, мы рассмотрим это поэтапно.

Как упоминалось ранее, объектом может быть любой элемент или событие. В Magento есть несколько сущностей, например: клиент, заказ, счет и продукт.В этой статье я буду использовать сущность продукта для объяснения реализации EAV. Основная таблица для продуктов — catalog_product_entity. Однако вы можете быть удивлены тем, что он содержит только несколько фрагментов информации, таких как тип объекта, артикул и время создания продукта.

Чтобы создать полную запись о продукте, нам нужно найти его атрибуты, а затем найти значение для каждого из атрибутов. В catalog_product_entity вы найдете столбец entity_type_id. Он используется во всей базе данных в качестве идентификатора типа объекта. Основываясь на типе объекта, мы можем узнать, какие атрибуты назначены продукту, заглянув в eav_attribute.

В этой таблице записываются все атрибуты для всех сущностей в Magento. Он также содержит метаданные для каждой записи, такие как тип данных, сведения о внешнем интерфейсе и т. д. Для продуктов идентификатор типа объекта имеет значение 4 (типы перечислены в таблице eav_entity_type). Чтобы выбрать все атрибуты, назначенные продуктам, мы просто делаем:

Имя атрибута записывается как attribute_code; из информации метаданных важным столбцом является backend_type. Это указывает, к какому типу данных относится атрибут и где хранятся значения атрибута. Magento допускает следующие типы данных:

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

После выполнения вышеуказанного запроса мы видим, что атрибут name имеет тип данных varchar. Значения атрибутов продукта хранятся в нескольких таблицах: catalog_product_entity_datetime, catalog_product_entity_decimal, catalog_product_entity_int, catalog_product_entity_text, catalog_product_entity_varchar. Эти имена таблиц иллюстрируют способ хранения различных типов данных в модели EAV.

Чтобы получить список всех продуктов и их названий, мы можем использовать такой запрос:

Концепция проста, если вы знаете, с чего начать и как найти следующую таблицу в иерархии. Все остальные объекты работают по тому же принципу: вы находите идентификатор типа объекта для интересующего вас объекта, затем вы получаете все атрибуты из eav_attribute на его основе и, наконец, выбираете значения для каждого атрибута из разных таблиц на основе типа атрибута.

Преимущества и недостатки модели EAV

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

Тот факт, что EAV обрабатывает только непустые атрибуты, означает, что нет необходимости резервировать дополнительное пространство для хранения атрибутов, значения которых будут нулевыми. Это делает модель EAV достаточно компактной.

Формат физических данных очень чистый и похож на XML, что позволяет легко сопоставлять данные с форматом XML; требуется только заменить имя атрибута на теги start-attribute и end-attribute.

Модель EAV отлично подходит для быстро развивающихся приложений, поскольку защищает нас от последствий постоянных изменений. Мы можем просто записывать новые данные любой структуры без необходимости изменять схему базы данных.

При рассмотрении EAV важно определить, являются ли данные разреженными и многочисленными, поскольку сложность дизайна EAV превышает его преимущества при использовании для неподходящего набора данных. Для схем, которые являются относительно статичными и/или простыми, более целесообразно использовать обычные таблицы.

Основным недостатком EAV является его более низкая эффективность при массовом извлечении данных по сравнению с обычной структурой. В модели EAV данные объекта более фрагментированы, поэтому для выбора всей записи объекта требуется несколько объединений таблиц. Более того, при работе с большими объемами данных EAV может потребоваться временное или постоянное преобразование между представлением одного и того же набора данных в виде столбцов и строк/EAV. Операция может быть подвержена ошибкам и может сильно нагружать ЦП.

Другим ограничением EAV является тот факт, что нам нужна дополнительная логика для выполнения задач, которые выполняются автоматически с помощью обычных схем. Однако существующие инструменты EAV могут быть реализованы для уменьшения накладных расходов.

Наконец, понимание модели EAV требует времени. У нее есть определенная кривая обучения, поэтому младшим разработчикам может быть сложно работать с этой моделью, прежде чем они смогут по-настоящему понять концепцию.

Заключение

Значение атрибута сущности следует рассматривать, если выполняются следующие условия:

  • Данные скудны и разнородны, с широким диапазоном атрибутов, которые могут применяться к объекту, и часто вводятся новые атрибуты.
  • Количество классов очень велико, причем классы имеют множество экземпляров, даже если атрибуты не разбросаны.
  • Существует множество гибридных классов, обладающих как разреженными, так и неразреженными атрибутами. Как правило, не все классы данных соответствуют требованиям моделирования EAV.

В рабочей среде схемы, как правило, смешиваются, включая традиционные реляционные, EAV или гибридные подходы. Однако моделирование EAV требует введения метаданных для сбора данных логической модели для EAV. Мы видели, что в Magento это используется с большим эффектом, когда различные продукты будут иметь очень разные наборы атрибутов; хорошая иллюстрация того, где эта модель может быть применена очень эффективно.

Надеюсь, этот пост показал вам, что такое модель EAV и как и, что более важно, когда ее использовать!

Принципы параллельных и распределенных вычислений

Раджкумар Буйя, . С. Тамараи Селви, в Mastering Cloud Computing, 2013 г.

2.3.2.1 Системы с одной командой и одними данными (SISD)

Вычислительная система SISD — это однопроцессорная машина, способная выполнять одну инструкцию, которая работает с одним потоком данных (см. рис. 2.2). В SISD машинные инструкции обрабатываются последовательно; поэтому компьютеры, использующие эту модель, обычно называют последовательными компьютерами. Большинство обычных компьютеров построены с использованием модели SISD. Все инструкции и данные, подлежащие обработке, должны храниться в основной памяти. Скорость элемента обработки в модели SISD ограничена скоростью, с которой компьютер может передавать информацию внутри себя. Основными репрезентативными системами SISD являются IBM PC, Macintosh и рабочие станции.

< бр />

Рисунок 2.2. Архитектура с одной инструкцией и одними данными (SISD).

Фон

Майкл МакКул, . Джеймс Рейндерс, Структурированное параллельное программирование, 2012 г.

2.4.3 Характеристика Флинна

Один из способов грубо охарактеризовать параллелизм, доступный в типах процессоров, — это то, как они сочетают поток управления и управление данными. Классическая категоризация Флинна [Fly72] делит параллельные процессоры на категории в зависимости от того, имеют ли они несколько потоков управления, несколько потоков данных или и то, и другое.

Одна инструкция, одни данные (SISD): это просто стандартный непараллельный процессор. Обычно мы называем это скалярным процессором. В соответствии с законом Амдала (обсуждаемым в разделе 2.5.4) производительность скалярной обработки важна; если он медленный, он может в конечном итоге доминировать в производительности.

Одна инструкция, несколько данных (SIMD): одна операция (задача) выполняется одновременно с несколькими элементами данных. Количество элементов в SIMD-операции может варьироваться от небольшого числа, например от 4 до 16 элементов в коротких векторных инструкциях, до тысяч, как в потоковых векторных процессорах. Процессоры SIMD также известны как процессоры массивов, поскольку они состоят из массива функциональных блоков с общим контроллером.

Множественные инструкции, множественные данные (MIMD): отдельные потоки инструкций, каждый со своим собственным потоком управления, работают с отдельными данными. Это характеризует использование нескольких ядер в одном процессоре, нескольких процессоров в одном компьютере и нескольких компьютеров в кластере. Когда в одной и той же компьютерной системе присутствует несколько процессоров, использующих разные архитектуры, мы говорим, что это гетерогенный компьютер. Примером может служить хост-процессор и сопроцессор с разными наборами инструкций.

Последняя возможная комбинация, MISD, не особенно полезна и не используется.

Другой способ, часто используемый для классификации компьютеров, заключается в том, может ли каждый процессор получить доступ к общей общей памяти или каждый процессор может получить доступ только к локальной памяти. Последний случай называется распределенной памятью. Многие системы с распределенной памятью имеют локальные подсистемы с общей памятью. В частности, кластеры представляют собой большие системы с распределенной памятью, образованные путем соединения множества компьютеров («узлов») с общей памятью высокоскоростной коммуникационной сетью. Кластеры формируются путем соединения независимых друг от друга систем, и почти всегда это системы MIMD. Часто компьютеры с общей памятью действительно имеют физически распределенные системы памяти; просто связь, используемая для создания иллюзии общей памяти, неявна.

Есть еще одна родственная классификация, используемая, в частности, поставщиками графических процессоров: одна инструкция, несколько потоков (SIMT). Это соответствует мозаичной архитектуре SIMD, состоящей из нескольких процессоров SIMD, где каждый процессор SIMD эмулирует несколько «потоков» (волокон в нашей терминологии) с использованием маскирования. Может показаться, что SIMT-процессоры имеют тысячи потоков, но на самом деле их блоки совместно используют управляющий процессор, а расходящийся поток управления может значительно снизить эффективность внутри блока.С другой стороны, синхронизация между волокнами практически бесплатна, потому что когда поток управления эмулируется с маскированием, волокна всегда работают синхронно.

Шаблоны доступа к памяти также могут влиять на производительность процессора, использующего модель SIMT. Обычно каждый подпроцессор SIMD в SIMT-машине предназначен для использования данных из строки кэша. Если доступ к памяти из разных волокон обращается к совершенно разным строкам кэша, тогда производительность падает, поскольку часто процессору требуется несколько циклов памяти для разрешения доступа к памяти. Это называется расходящимся доступом к памяти. Напротив, если все волокна в ядре SIMD обращаются к одним и тем же строкам кэша, то обращения к памяти могут быть объединены и производительность повышена. Важно отметить, что это прямо противоположно тому, что мы хотели бы сделать, если бы волокна действительно были отдельными потоками. Если волокна работали на разных ядрах, мы хотим избежать доступа к одной и той же строке кэша. Таким образом, хотя код, написанный для использования волокон, может быть реализован с использованием аппаратных потоков на нескольких ядрах, код, должным образом оптимизированный для волокон, на самом деле будет неоптимальным для потоков, когда речь идет о доступе к памяти.

Функции SIMD через OpenMP

Джордж М. Раскулинец, Евгений Фиксман, в High Performance Parallelism Pearls, 2015

Обзор векторизации SIMD

Векторизация — это процесс преобразования скалярной операции, воздействующей на отдельные элементы данных (Single Instruction Single Data —SISD), в операцию, в которой одна инструкция работает одновременно с несколькими элементами данных (SIMD). Современные процессорные ядра Intel имеют выделенные векторные блоки, поддерживающие параллельную обработку данных SIMD. Пример операции с поддержкой SIMD показан на рис. 22.1.

< бр />

Рисунок 22.1. Пример векторной операции Intel® AVX (SIMD).

Процессоры Intel, поддерживающие Intel® Advanced Vector Extensions (Intel® AVX), имеют по одному 256-битному векторному блоку на ядро. Таким образом, каждое ядро ​​может обрабатывать восемь операций с плавающей запятой одинарной точности (например, 32-битных) или четыре операции с плавающей запятой двойной точности (например, 64-битных) с использованием одной инструкции. Расширения Intel® Advanced Vector Extensions 512 (Intel® AVX-512) удваивают количество регистров и размер векторного блока до 512 бит, так что каждый векторный блок на ядро ​​может выполнять 16 операций с одинарной точностью или 8 операций с двойной точностью на инструкцию. . Некоторые новые процессоры Xeon также поддерживают векторные инструкции AVX-512, как и процессоры Intel Xeon Phi, и практически такие же, как 512-битные SIMD в исходных сопроцессорах.

Более крупные векторные блоки и расширенные функциональные возможности приводят к значительному ускорению работы многих реальных приложений. На рис. 22.2 показаны результаты производительности финансового приложения, оценивающего опционы с помощью трехчленного дерева. Первые (более короткие, с более низкой производительностью) в каждой паре используют только потоки, а вторые (более высокие, с более высокой производительностью) объединяют как параллельные потоки, так и векторные единицы. Добавленное ускорение векторных блоков, особенно в последние годы, впечатляет.

< бр />

Рисунок 22.2. Сравнение ускорения между многопоточным и многопоточным + векторизованным кодом.

Революция процессоров

Сайед В. Ахамед, Intelligent Networks, 2013 г.

2.9.3 От CPUS к OPU

Чтобы проиллюстрировать концепцию, мы представляем рисунок 2.8, изображающий архитектуру SPSO, OPU, которая соответствует архитектуре процессора SISD von Neumann. Процессоры SPSO аналогичны процессорам SISD для традиционных ЦП. Когда объект невосприимчив к обработке, аппаратное обеспечение OPU упрощается до традиционного аппаратного обеспечения ЦП с регистром команд (IR) для хранения кода операции, регистром данных (DR), регистром адреса памяти (MAR), счетчиком программ (PC), и набор регистров A, B и C. ЦП функционирует в соответствии с циклом выборки, декодирования, выполнения (FDE) в простейшем случае.

Рисунок 2.8. Упрощенное представление процессора SPSO, работающего с одним объектом и его атрибутами. Когда он заменяет FPU и ALU в схеме на рис. 2.1, систему можно заставить работать как простой объектный компьютер фон Неймана.

Последующие традиционные компьютерные архитектуры с несколькими процессорами, несколькими модулями памяти, вторичной памятью, процессорами ввода-вывода и сложными операционными системами зависят от эффективности и оптимальности функций ЦП. ЦП несет основную тяжесть действий и выполнения кода операции (opc) для основных программ. Распределение традиционных функций ЦП на множество подчиненных процессоров сделало общую обработку более быстрой и эффективной. Можно сопоставить более сложные конструкции ЦП с соответствующими конструкциями OPU.

Архитектура SPSO становится более сложной, чтобы учесть всю энтропию обрабатываемого объекта. Энтропия может иметь ряд других зависимых объектов, их отношения с основным объектом, его атрибуты и атрибуты зависимого объекта.

Формат объектов и атрибутов может быть буквенно-цифровым (числовым, буквенно-цифровым и/или описательным), а не чисто символическим. Первичные и вторичные объекты и их атрибуты могут быть локальными и предопределенными в самых простых случаях, или они могут быть размещены в Интернете и получены из всемирной паутины или банков знаний WWW. Выполнение одного кода операции со знаниями (kopc) может влиять на энтропию отдельного объекта через вторичные объекты и атрибуты. По сути, необходимы многочисленные кэши, чтобы отслеживать полное влияние одного процесса kopc на всю энтропию одного объекта в процессоре SPSO.

Видно, что конфигурации машин для других типов архитектур, т. е. процессоров SPMO, MPSO, MPMO и конвейерных объектных процессоров Ahamed (2009), могут быть получены с помощью вариаций, аналогичных тем, которые используются для систем SPSO. В следующих разделах мы представляем изменения для объектного процессора и объектной машины типа MPMO.

Мультипроцессоры

Питер Ю.К. Ченг, . Уэйн Лук, Справочник по электротехнике, 2005 г.

2.1 Введение

Поскольку как стоимость, так и производительность микропроцессоров продолжают расти, создание компьютерных систем, содержащих много процессоров, становится все более привлекательным. Повышение производительности — одно из очевидных преимуществ многопроцессорной системы. В идеальном случае система с N процессорами может обеспечить N ускорение выполнения задач, связанных с вычислительными ресурсами. Учитывая, что стоимость микропроцессора составляет небольшую долю от общей стоимости системы, экономическая эффективность такого подхода очевидна. Другой, но не менее важной причиной использования многопроцессорных систем является повышение надежности. Идея здесь в том, что даже если один процессор выйдет из строя, система будет продолжать работать, хотя и медленнее. Рабочая нагрузка вышедшего из строя процессора будет автоматически взята на себя оставшимися процессорами.

В настоящее время многопроцессорные системы можно найти во многих приложениях. Большинство файловых серверов и серверов World Wide Web построены на машинах, которые могут иметь два или более процессоров. Отрасль обработки данных, требующая обработки транзакций с большими базами данных, использует многопроцессорные системы в качестве стандарта.

Существует два взгляда на то, как многопроцессорная система повышает производительность: (1) увеличение пропускной способности для независимых задач, распределенных между несколькими процессорами, и (2) более быстрое выполнение одной задачи на нескольких процессорах. Организация и дизайн системы значительно различаются для двух разных целей; некоторые системные архитектуры обсуждаются в разделе 2.2. Программирование системы также сильно зависит от архитектуры и желаемой функциональности, как описано в Разделе 2.4.

Один общий способ классификации всех компьютерных систем был первоначально предложен Флинном (1972 г.), как показано в следующем списке:

Машины с одной инструкцией и одними данными (SISD) относятся к одному процессору, выполняющему один поток инструкций, который работает с данными, хранящимися в одной памяти. К этой категории относятся все однопроцессорные системы.

Машины с одной инструкцией и несколькими данными (SIMD) позволяют одному потоку инструкций управлять многими элементами обработки синхронно. Каждый процессор имеет собственную память данных, поэтому на каждом шаге инструкции одновременно обрабатывается множество наборов данных. И векторные процессоры, такие как CRAY T80, и процессоры массивов, такие как Connection Machine (Хиллис, 1986 г.), являются SIMD-машинами.

Машины с несколькими инструкциями и одними данными (MISD) позволяют отправлять общую последовательность данных на несколько процессоров, каждый из которых работает с данными с помощью отдельной инструкции. Этот тип машинной структуры не очень удобен и никогда не применялся в реальных системах.

Машины с несколькими инструкциями и несколькими данными (MIMD) — это несколько процессоров, одновременно выполняющих разные инструкции для разных потоков данных. Это наиболее распространенная многопроцессорная структура; симметричные многопроцессорные системы (SMP), кластеры и системы с неоднородным доступом к памяти (NUMA) — все это примеры этой категории.

В следующих разделах мы рассмотрим различную организацию, используемую в многопроцессорных системах. Ключевые вопросы, которые рассматриваются, включают:

Как несколько процессоров обмениваются данными?

Как кэш-память на разных процессорах правильно хранит свои данные?

Как несколько процессоров взаимодействуют друг с другом и координируют свои действия?

Сколько процессоров требуется и какого повышения производительности можно ожидать?

Читайте также: