Now, you only have to get the second column when the first one is given.
Of course, if Product A matches Product B, and this always implies that Product B matches Product A, then you must have two rows in the current version. One row will be (ProductA, ProductB) and the other row will be (ProductB,ProductA).
If you want to avoid having two rows, you can create a view on this table that uses only one row to create the illusion of two.
The view could be based on something like this:
Select product_id, matching_product_id from Product_Match
Select matching_product_id, product_id from Product_Match
This way, your queries are simple, there is no need to have two rows for matched product pairs.
The cost you pay for this is in defining the view, and slightly slower times querying the view.
Depending on the number of products and the number of matched products, this may not even prove to be a problem.
You are correct with the latter assumption that if A matches B, then B matches A. However, I am not sure I completely understand your solution. The selection of records in either case is simple, it is the updating that becomes a pain.
One table for the Items. One table for relationships between those items. I'm not sure what you were getting at with the grouping and whatnot... do you need to have multiple configurations for each item?