Requests and friendships are separate tables
One table with a status column would hold both, and every friend lookup would then have to filter on that status — the most common read in the product paying for the rarest state. Separating them keeps friendships to accepted rows only, and lets a declined request be deleted or retained without touching the graph. The cost is that accepting is a delete and an insert in one transaction.