Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

что-то вроде

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

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

Вступление в представления CouchDB

Ответ 2

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

В CouchDB или любой другой, не являющейся РСУБД, вы не будете хранить свои данные так же, как в СУБД, так что создание отношений таким образом может быть не лучшим. Но просто для того, чтобы дать вам представление о том, как вы можете это сделать, давайте предположим, что у вас есть документ для поставщика и куча документов для заказов, которые должны "относиться" к документу поставщика.

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

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

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

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

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

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

Ответ 3

Пока невозможно создать ограничение FK, возможно использование функции Couch Validate

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?