Обсуждение
В нескольких коммерческих системах баз данных используются идентификаторы кортежей (tid) как неявные атрибуты, позволяющие различить множественные вхождения кортежа. В этих системах выполняются преобразования SQL-запросов, которые могут влиять на мультимножественную семантику (например, замена вложенных подзапросов соединениями), и уникальные tid’ы используются, в случае потребности, для получения корректной семантики. Это делается следующим образом. Для отношений, перечисленных в разделе FROM, т.е. для тех отношений, которые вносят вклад в мультимножественную семантику, tid’ы выбираются вместе со всеми другими атрибутами, встречающимися в разделе SELECT, и в результирующем отношении производится удаление дубликатов. На заключительной фазе выполняется проецирование, устраняющее атрибуты-tid’ы, и получается желаемое мультимножественное отношение.
Этот подход обладает тем преимуществом использования соединений, а не ?-полусоединений, что позволяется использовать большее число порядков соединения. Однако у него имеется несколько недостатков. Во-первых, его невозможно использовать в связи с группировкой/агрегированием. Во-вторых, оптимизатор должен отслеживать tid’ы при выполнении операций и производить удаление дубликатов. Наш подход использования операции ?-полусоединения является более чистым, поскольку он может единообразно справляться как с SQL-запросами с мультимножественной семантикой, так и с запросами с множественной семантикой. Кроме того, наш запрос позволяет избежать расходов на явное удаление дубликатов и на поддержку tid’ов и работу с ними.