My initial thought is a table for the people (buying or selling or both). A second table for the request/listing (for sale or request to buy). The matching will come by the fields describing the listing/request. Matching on ZIpCode or Square Footage, etc. Have both in the same table simplifies the search.
May take a filtered portal, ExecuteSQL or performing a find instead of using a relationship to get the results that you want.