LINUX.ORG.RU

Что делать, когда ForeignKey всё-таки нужен?

 ,


0

1

Рассматриваю возможность переноса одного проекта в компании на нереляционную структуру данных. Есть следующий кусок структуры:

Услуга:
    Код (PK)
    Наименование
    Цена
    
Работа:
    Код (PK)
    Код услуги (FK)
    Цена (дублируется из услуги, иногда изменяется)
    
Материалы:
    Код (PK)
    Код работы (FK)
В текущей логике, сталкивались с некоторыми проблемами (в основном, из-за тупых клиентов): клиент, игнорируя предупреждение о том, что при удалении услуги, будут удалены все связанные с ней работы, жамкал по кнопке, а потом звонил, и требовал поднять бэкап (галочку "[x] пометить как неактивную" некоторые игнорируют).

В нереляционной модели, отношение 1:M у работы-материалов будет просто включено как поддокумент, т.е.

    Код (PK)
    Код услуги (FK)
    Материалы: {
        ...
    }
А вот отношение работы к услуге я представить пока не могу.

Вносить все выполненные работы внутрь услуги не выйдет, работы группируются по еще одному общему предку (по 1:M), а в отчетах нужно обязательно иметь возможность показать все работы, проведенные по данной услуге.

Если я правильно понимаю, каждый корневой документ в MongoDB имеет уникальный ключ _id, по которому было бы логично руками прописывать связь, без устроения FK. Но тогда, при удалении услуги, работа «ссылается» на несуществующий документ, что отчасти хорошо, так как не теряются данные, но плохо в том, что отсутствует информация.

Как вариант я рассматривал полностью дублировать поля услуги в работе, но это значительно увеличит размер хранимой информации.

Как решать подобные вещи? Очень сложно после SQL воспринимать данные как документы. По документации, подобная структура не очень одобряется.

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

нужно понять лишь одну простую истину - RDBMS для одних задач, NOSQL - для других. Они не взаимозаменяемы и к ним нельзя применить «лучше/хуже».

Deleted
()

Как решать подобные вещи?

1. ALTER TABLE Услуга ADD удалена BOOL;

2. Переписываешь взаимодействие с БД, устраняя потерю данных;

3. Переносишь на другую базу, если это требуется.

jerk-of-all-trades
()
Ответ на: комментарий от Deleted

Живется хорошо, правда погода как в штатах (судя по фоткам) - сначала всё залило, а потом заморозило.

Потребность ощущается - много мест, в которых структура документа реально вписывается в систему, а текущая реализация - костыль под неё. Проект только выползает из стадии тестирования, перенос данных еще возможен.

Сейчас еще перечитал документацию, там все же говорят хранить ObjectId, хоть это и не самое лучшее решение.

Spectator
() автор топика
Ответ на: комментарий от jerk-of-all-trades

Вопрос не в реализации на SQL, а аналоге связи в NoSQL.

Spectator
() автор топика

Поддерживаю первый коммент.

Если я правильно понимаю, каждый корневой документ в MongoDB имеет уникальный ключ _id, по которому было бы логично руками прописывать связь, без устроения FK. Но тогда, при удалении услуги, работа «ссылается» на несуществующий документ, что отчасти хорошо, так как не теряются данные, но плохо в том, что отсутствует информация.

1. В MongoDB нет понятий PK/FK.

2. Транзакций в монго тоже нет и ты правильно все заметил. Есть два пути: костыли (как сделать описано в оф. доках) или использовать TokuMX

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)

Рассматриваю возможность переноса одного проекта в компании на нереляционную структуру данных^W^W^Wmongodb

А не рассматриваешь осилить hstore или json в postgresql?

anonymous
()

А физически удалять обязательно? Можно помечать запись как удаленную.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.