2016-11-09 7 views
-1

Я хочу создать простую базу данных, которая должна хранить узлы, их функциональные возможности и адрес для уведомления в случае возникновения проблем. Первоначально я думал об использовании простой базы данных 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"; 
+1

Ваша структура данных не ясна. Может ли любой узел сочетаться с любой функциональностью и любым адресом (и любым адресом с любым узлом и функциями и т. Д.), Но не все они автоматически существуют? Тогда вы получите стол, подобный этому. Хотя я бы не использовал идентификаторы 'text', вы могли бы использовать' varchar' (и убедитесь, что вы вводите только допустимые значения и рассматриваете их как код) или используйте 2-3 таблицы поиска со всеми функциями и узлами (и, возможно, адресами) и используйте их идентификатор или код для ввода в эту таблицу. – Solarflare

+0

@Solarflare, как вы описали, несколько узлов могут иметь одинаковые функции и адреса, как и все. Таблицы поиска - это нормализованная опция. Я предлагаю, где у меня есть список узлов, список func и список адресов. Затем, используя одну таблицу, я буду объединять идентификаторы каждого из них. Это очень ресурсоемкий? Или это лучший вариант. Или лучше использовать подход Redis? – jlanza

+1

Ваша таблица нормализована, как есть. Использование 3 таблиц поиска не имеет ничего общего с нормализацией, вам нужно только сделать это, если вам нужно, например. описание или любые другие данные в дополнение к вашему ключу (который может быть строкой, хотя я бы использовал «varchar», а затем сохранить их короче, предпочтительнее не-utf8), или если вы хотите проверить значения с помощью внешнего ключа , В противном случае это зависит от вашего личного вкуса, если вы хотите заменить их целыми идентификаторами. То же самое для redis или mysql. 10k строк не будет иметь никакого значения в производительности, так что это личный вкус. Просто добавьте индексы. – Solarflare

ответ

0

Нормализация У вас есть таблица. Перед тем, как начать «нормализацию» или начать говорить о «нормализации», узнать, какая нормализация is. Вот главный вопрос: можете ли вы заменить эту таблицу на меньшие, чтобы они всегда к ней присоединялись? Чтобы это было так, можно было бы рассказать критерий для строки в таблице в данной ситуации приложения как «... И ...» для одного или нескольких И. Если вы можете, нормализация может предложить сделать эту замену. Если вы этого не сделаете, это не произойдет. (Значения в основном не позволяют нам это определить.)

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

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

+0

Моя основная проблема заключается в том, что я не знаю, действительно ли это ухудшает производительность, чтобы иметь только одну таблицу, дублирование строк и поиск на ней, или она будет лучше работать с простыми таблицами и объединением таблицы и поиска, где whaterver равно строке. отредактированный вопрос.Какой вариант лучше, и проще управлять? Рассмотрение как вставки, выбора, так и удаления. – jlanza

+0

В моем ответе, когда мы нормализуем, мы «заменяем эту таблицу на меньшие, чтобы они всегда к ней присоединялись». ids не является нормализацией. Если вы спрашиваете о замене таблицы столбцами строки на один с столбцами id плюс несколько таблиц, отображающих идентификаторы в строки, тогда * скажите так *. (То есть сделайте попытку найти слова и предложения, которые говорят это. I j ust сделал). Это явно * усложняет * схему и запросы. Но за мой ответ «лучше» [* зависит *] (http://stackoverflow.com/a/32151278/3404097). PS В этом вопросе нет ничего об этом. Я догадываюсь из вашего кода и этого комментария. – philipxy

+0

Если вы хотите «оптимизировать», вам сначала нужно узнать о * design *, а затем узнать о нескольких способах запроса для одной и той же вещи *, а затем узнать о * оптимизации в вашей конкретной СУБД *. Плюс, чтобы сравнить с альтернативной системой, тогда вы должны изучить * то же самое об этом *. – philipxy

Смежные вопросы