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