Один из вариантов — разбивать персональные данные по таблицам ключ-значение, где ключ — случайное сгенерированное значение, значение — элемент персональных данных (телефон, паспортные данные, адрес и т.п.). Далее эти таблицы при желании можно двигать, перемещая их, например, в отдельный «как-бы-более-защищенный» инстанс. При особой паранойе, внешний ключ к персональным данным, который хранится в таблице с пользователем, может шифроваться и перешифровываться в соответствии с заданной политикой. Таким образом, запрос на выборку персональных данных начинает выглядеть так:
select a.*, p.* from account a join personal_data p on a.encrypted_pdata_fk = encrypt(p.id, <соль>):