Я хочу создать простую базу данных, которая должна хранить узлы, их функциональные возможности и адрес для уведомления в случае возникновения проблем. Первоначально я думал об использовании простой базы данных SQL:Redis vs MySQL для простой базы данных
CREATE TABLE IF NOT EXISTS push_notifications (
node text NOT NULL,
functionality text NOT NULL,
address text NOT NULL,
);
, где узлы и функции могут иметь много адрес, N до N. Таким образом, чтобы получить адрес я просто выполнить эти два предложения:
SELECT address from push_notifications where node=XX and functionality=YY;
SELECT node, functionality from push_notifications where address=XX ORDER BY node, functionality;
Однако после прочтения немного, у меня есть несколько сомнений по:
- Это нормально для базы данных, которая изначально не будет иметь более чем 10000 записей?
- Должен ли я использовать нормализованный способ организации таблиц, то есть один для узлов, другой для функций, другой для адресов и использования JOIN в SELECT? Затем, как я могу автоматически удалить записи из таблиц, которые больше не связаны, то есть узел, который не имеет функциональности и не имеет конечной точки?
- Должен ли я использовать, например, простой движок базы данных, такой как Redis, установив ключи для функциональности узла (строка и значение список адресов) и другой набор ключей для конечных точек (хэш)?
Я хотел бы добавить, что я буду использовать Java для обработки доступа к данным.
Спасибо вам за помощь. Я был бы очень признателен и посоветовал бы, как лучше всего это сделать.
Edit: опция для выбора с несколькими простыми таблицами (я думаю, что все в порядке)
CREATE TABLE IF NOT EXISTS node (
id integer PRIMARY KEY AUTOINCREMENT,
iri text NOT NULL,
UNIQUE(iri) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS functionality (
id integer PRIMARY KEY AUTOINCREMENT,
name text NOT NULL,
UNIQUE(name) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS address (
id integer PRIMARY KEY AUTOINCREMENT,
url text NOT NULL,
UNIQUE(url) ON CONFLICT IGNORE -- ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS push_info (
node integer NOT NULL,
functionality integer NOT NULL,
address integer NOT NULL,
UNIQUE(sensor, endpoint) ON CONFLICT IGNORE, -- ON CONFLICT REPLACE
FOREIGN KEY(node) REFERENCES node(id) ON DELETE CASCADE
FOREIGN KEY(functionality) REFERENCES functionality(id) ON DELETE CASCADE
FOREIGN KEY(address) REFERENCES address(id) ON DELETE CASCADE
);
SELECT address.url as address
FROM address
INNER JOIN push_info
ON address.id = push_info.address
INNER JOIN node
ON node.id = push_info.node
INNER JOIN functionality
ON functionality.id = push_info.functionality
WHERE
node.iri = "node1" AND
functionality.name = "functionality1";
Ваша структура данных не ясна. Может ли любой узел сочетаться с любой функциональностью и любым адресом (и любым адресом с любым узлом и функциями и т. Д.), Но не все они автоматически существуют? Тогда вы получите стол, подобный этому. Хотя я бы не использовал идентификаторы 'text', вы могли бы использовать' varchar' (и убедитесь, что вы вводите только допустимые значения и рассматриваете их как код) или используйте 2-3 таблицы поиска со всеми функциями и узлами (и, возможно, адресами) и используйте их идентификатор или код для ввода в эту таблицу. – Solarflare
@Solarflare, как вы описали, несколько узлов могут иметь одинаковые функции и адреса, как и все. Таблицы поиска - это нормализованная опция. Я предлагаю, где у меня есть список узлов, список func и список адресов. Затем, используя одну таблицу, я буду объединять идентификаторы каждого из них. Это очень ресурсоемкий? Или это лучший вариант. Или лучше использовать подход Redis? – jlanza
Ваша таблица нормализована, как есть. Использование 3 таблиц поиска не имеет ничего общего с нормализацией, вам нужно только сделать это, если вам нужно, например. описание или любые другие данные в дополнение к вашему ключу (который может быть строкой, хотя я бы использовал «varchar», а затем сохранить их короче, предпочтительнее не-utf8), или если вы хотите проверить значения с помощью внешнего ключа , В противном случае это зависит от вашего личного вкуса, если вы хотите заменить их целыми идентификаторами. То же самое для redis или mysql. 10k строк не будет иметь никакого значения в производительности, так что это личный вкус. Просто добавьте индексы. – Solarflare