Поддерживает ли Google Cloud Spanner произвольные отношения "многие ко многим"?

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

Похоже, что единственный вид отношений, поддерживаемый Cloud Spanner, - это отношения с чередованием таблиц ... но, честно говоря, хранилища документов NoSQL, такие как MongoDB, уже предоставляют это много.

Как бы вы реализовали отношения «многие ко многим» в Cloud Spanner?

РЕДАКТИРОВАТЬ:

В моем конкретном случае мне нужна функция, похожая на фолловеров Twitter, а «Подписка» - это прямое отношение от одного пользователя к другому.

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


person brocoli    schedule 21.03.2017    source источник


Ответы (2)


Cloud Spanner поддерживает полный спектр объединений (внутреннее, перекрестное, полное, левое , Правильно). Он позволяет создавать и запрашивать отношения «многие ко многим» так же, как в стандартной базе данных SQL.

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

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

Parent key = account_id
-- Many 1 key = account_id, user_id
-- Many 2 key = account_id, group_id

Это позволит вам делать запросы, которые касаются только одного разбиения, делая их быстрыми, эффективными и свободными от конфликтов.

Cloud Spanner также имеет тип массива, который в зависимости от вашего варианта использования также может быть полезен.

РЕДАКТИРОВАТЬ: отвечая на

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

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

Кроме того, в этой ситуации я не могу, например, каскадно удалить Many2, потому что его ссылка в Many1 была удалена, верно? Единственное каскадное удаление, которое я могу выполнить в этом случае, - это удалить весь родительский элемент.

Да, это правильно.

person Daniel Compton    schedule 21.03.2017
comment
Привет, большое спасибо за ответ! Но наличие родительской таблицы с чередованием в моем случае не очень помогает ... это скорее способ вручную оптимизировать разбиение. Я отредактирую свой вопрос, указав более подробную информацию о моем конкретном случае. Кроме того, в этой ситуации я не могу, например, каскадно удалить Many2, потому что его ссылка в Many1 была удалена, верно? Единственное каскадное удаление, которое я могу выполнить в этом случае, - это удалить весь родительский элемент. - person brocoli; 22.03.2017

Cloud Spanner теперь поддерживает внешний ключ.

Использованная литература:

person X.J    schedule 07.05.2020