То, что действительно важно для правильного определения этих таблиц, это первичный ключ. Если человеку разрешено звонить другому человеку несколько раз, и каждый из них представлен отдельной строкой, то (Caller, Callee) не является ключом-кандидатом. Должен быть что-то вроде суррогатного ключа или какой-то временной метки, которая используется для того, чтобы у вас был хороший первичный ключ.
Кроме того, с точки зрения бизнес-правил, если отношения обратимы, когда в любое время вы ищете звонки, вам нужно только, чтобы две стороны были одинаковыми (а не кто звонил кому), если таблица различает их в способ у вас может быть проблематичным. Типичным способом решения этой проблемы является наличие таблицы Calls и таблицы CallParties, которая связывает вызов со сторонами в вызове (которые могут иметь флаги, которые помогают идентифицировать инициатора вызова). Таким образом, зависимость порядка столбцов исчезает, и МОЖЕТ упростить некоторые запросы (это может усложнить другие). Это также может уменьшить количество необходимых индексов.
Итак, я бы сначала рассмотрел дизайн таблицы, как он у вас есть, но также учел возможную необходимость в разворотах.