Поддерживает ли CouchDB ссылочную целостность? - PullRequest
13 голосов
/ 23 декабря 2009

Я новичок в CouchDB и узнаю об этом. Я не сталкивался с поддержкой CouchDB для ссылочной целостности. Можем ли мы создать внешний ключ для поля в документе CouchDB?

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

Поддерживает ли CouchDB ссылочную целостность? И возможно ли сделать поле в документе первичным ключом?

Ответы [ 3 ]

11 голосов
/ 23 декабря 2009

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

Что касается того, можете ли вы сделать поле первичным ключом, то первичным ключом является поле _id, но вы можете использовать любой допустимый json в качестве ключа для представлений в БД. Так, например, вы можете создать представление заказов, указав в качестве ключа их поставщика.

что-то вроде

function(doc) {
  if (doc.type == 'order')
    emit(doc.vendor,doc);
}

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

Знакомство с представлениями CouchDB

8 голосов
/ 23 декабря 2009

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

В CouchDB или любой другой не-RDBMS вы не будете хранить свои данные так же, как в RDBMS, поэтому проектирование отношений таким способом может быть не лучшим. Но просто для того, чтобы дать вам представление о том, как вы могли бы это сделать, давайте предположим, что у вас есть документ для поставщика и пакет документов для заказов, которые необходимо «связать» с документом поставщика.

Первичных ключей нет, в документах есть _id, который является uuid. Если у вас есть документ для поставщика, и вы создаете новый документ для чего-то вроде заказа, вы можете ссылаться на документы поставщика _id.

{"type":"order","vendor-id":"asd7d7f6ds76f7d7s"}

Чтобы просмотреть все заказы для конкретного поставщика, вы должны иметь вид карты примерно так:

function(doc) { if (doc.type == 'order') {emit(doc['vendor-id'], doc)}}

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

Надеюсь, это немного поможет.

0 голосов
/ 19 февраля 2016

Хотя невозможно создать ограничение FK, это возможно с помощью функции Validate Couch

function(newDoc, oldDoc, userCtx, secObj) {
    if(newDoc && newDoc.type) switch(newDoc.type){
        case 'fish':
            var allSpecies = ['trout','goldfish'];
            if(!allSpecies.contains(newDoc.species)){
                throw({forbidden : 'fish must be of a know species'});
            }
            break;
        case 'mammals':
            if(!['M','F'].contains(newDoc.sex)){
                throw({forbidden : 'mammals must have their sex listed'});
            }
            break;
    }
}

Теперь, если человек действительно умный (я не такой), он мог бы обратиться к самой БД за списком видов ... это был бы внешний ключ.

Вы также можете прочитать: Как мне высушить мои просмотры CouchDB?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...