If friendship is intended to be symmetrical (i.e. it is not possible for A
to be friends with B
but not vice-versa) then I would just store the one way relationship with a check constraint ensuring that each relationship can only be represented one way.
Also I would ditch the surrogate id and have a composite PK instead (and possibly a composite unique index also on the reversed columns).
CREATE TABLE Friends
(
UserID1 INT NOT NULL REFERENCES Users(UserID),
UserID2 INT NOT NULL REFERENCES Users(UserID),
CONSTRAINT CheckOneWay CHECK (UserID1 < UserID2),
CONSTRAINT PK_Friends_UserID1_UserID2 PRIMARY KEY (UserID1, UserID2),
CONSTRAINT PK_Friends_UserID2_UserID1UQ_Friends_UserID2_UserID1 UNIQUE (UserID2, UserID1),
)
You don't say the queries that this makes difficult but you can always create a View
CREATE VIEW Foo
AS
SELECT UserID1,UserID2
FROM Friends
UNION ALL
SELECT UserID2,UserID1
FROM Friends