Вы сравниваете яблоко с апельсином, если сравниваете GraphQL с ElasticSearch. Это совершенно разные технологии.
GraphQL - это технология уровня API, которая сравнивается с REST. Он в основном определяет формат запроса / ответа и структуру вашего HTTP на основе API. Это не другой NoSQL, который поможет вам эффективно хранить и запрашивать данные.
Если вы используете GraphQL, вам все равно нужно самостоятельно запрашивать данные, которые могут фактически храниться и поступать из NoSQL, SQL DB, ElasticSearch или другого веб-сервиса или блаблабла. GraphQL не заботится о том, где вы храните данные, данные могут даже храниться в нескольких источниках данных. Его волнует, что вы говорите ему, как получить данные.
Вернемся к вашему случаю. Скорее всего, вы можете использовать ElasticSearch для эффективного хранения и поиска данных. И поместите GraphQL перед ElasticSearch так, чтобы пользователи / разработчики взаимодействовали со службой через GraphQL API, чтобы воспользоваться преимуществами GraphQL .
Ну, это - "нормальная" связь "один ко многим" и метод, который Вы предлагаете, классический для решения его.
Обратите внимание, что две таблицы денормализовываются (я не могу указать точно, где superkey-is-not-well-should-be-subset-of-other-key-fsck-I-forgot часть, но я вполне уверен, это там где-нибудь); интуитивная причина состоит в том, что кортеж в первом соответствует самое большее кортежу во втором, поэтому если у Вас нет большого количества животных с пустыми идентификаторами родителя и дамы, это не хорошее решение ни в какой перспективе (он ухудшается, производительность - нуждаются в соединении - и не уменьшает требования устройства хранения данных).
Я задал подобный вопрос много месяцев назад на веб-сайте MySQL. Я рекомендовал бы смотреть на ответ, который я получил от Peter Brawley относительно этого типа отношений: http://forums.mysql.com/read.php?135,187196,187196#msg-187196
Если бы Вы хотите исследовать тему далее затем, я рекомендовал бы изучить Древовидные Иерархии на Википедию.
Альтернатива предложила архитектуру (который будет полностью нормализован), посмотрел бы что-то как следующее:
Таблица: животное
Идентификатор | имя | порода
Таблица: родословная
animal_id | parent_id | parentType (или родитель или дама)
Я думаю, что Ваше расположение, использующее всего одну таблицу, прекрасно. Вы определенно хотите сохранить SIRE_ID и DAME_ID в совпадающем типе данных как идентификатор. Вы также хотите объявить их как ВНЕШНИЕ КЛЮЧИ (возможно иметь точку внешнего ключа назад к той же таблице, и внешний ключ может также быть пустым).
ID INT NOT NULL PRIMARY KEY
SIRE_ID INT REFERENCES TABLENAME (ID)
DAME_ID INT REFERENCES TABLENAME (ID)
Используя это расположение, можно легко искать родительских животных, и Вы могли также создать дерево потомков для данного животного (для Oracle существует ПОДКЛЮЧЕНИЕ),
INT является лучшим выбором для столбца ID и лучше удовлетворенный, если необходимо использовать последовательность для генерации уникальных идентификаторов.
Я не вижу преимущества в разделении дизайна в две таблицы.
Я не знаю о животноводстве, но оно кажется, что Ваш Sire_ID является родительским элементом, и Dame_ID является родительским элементом?Нет проблем. Одна строка на животное, пустой указатель sire_ и dame_ID для купленных животных, я не предвижу проблем.
[ID],[Sire_ID],[Dame_ID];
0,null,null (male)
1,null,null (female)
2,null,null (female)
3,0,1 (male)
4,0,2 (male)
5,null,null (female)
6,3,5
7,4,5
и т.д. Вы, вероятно, заполнили бы TreeView или XmlNodeList в некоторое время цикле...
While (myAnimal.HasChildren) {
Animal[] children = GetChildren(Animal.ID)
for (int x=0; x<children.length; x++)
myAnimal.Children.Add(children[x]);
}
В этом случае, Животное. Детьми является Набор Животных. Поэтому myAnimal. Дети [0].Father возвратился бы, myAnimal..Parent [] мог быть набором своих двух родителей, которые должны работать целых [0], всегда один родитель (родительский элемент), и [1] всегда другой (родительский элемент).
Сделайте идентификатор Автонумерацией PK и присвойте Sire_ID и Dame_ID программно путем возврата идентификаторов его родителей. Никакие отношения внешнего ключа не должны быть необходимыми, хотя оба родительских идентификатора могли сослаться назад к идентификатору, если Вы действительно хотите.
Используйте "подключение" пунктом с SQL для сообщения этого который иерархия следовать.
Это не действительно связь "один ко многим", если у животного не может быть многих родителей.
Я оставил бы его как единственную таблицу с идентификатором уникального ключа для животного, одним международным полем для каждого из родителей и вероятно текстовым полем для использования для общих сведений о животном, как то, где это было куплено, если это так.
Я думаю что, так как ясно, что у животного только есть один родитель и одна дамба, что использование единственной таблицы имело бы большую часть смысла. Мое предпочтение состоит в том, чтобы использовать интервал или bigint как идентификатор строки с нулевым значением, показывающим отношения. Я был бы, вероятно, затем, для использования некоторого другого метода для однозначного определения животных, таким образом, они не заканчивают в таблице дважды и создают уникальный индекс на том столбце также.
Кажется, что Вы хотите создать что-то как дерево.
Что относительно чего-то как?:
ID Primary Key,
Parent_ID Foreing_Key
( data )
Существует некоторая функциональность для того, чтобы сделать запросы в таблицах с отношениями к себе. Посмотрите синтаксис Подключения: http://www.adp-gmbh.ch/ora/sql/connect_by.html