What you are describing is a "many to many self join". Your text field that lists part numbers can actually be used for this as a self join relationship like this:
catalogTable::AlternatesList = CatalogTable|Alt::PartNumber
Will allow a portal to list all the alternate parts numbers
Another option is to set up a Join table for this:
CatalogTable::PartNumber = Part_Alternates::PartNumber
CatalogTable|Alt::PartNumber = Part_Alternates::AltPartNumber
CatalogTable|Alt is a second table occurrence of your existing catalog table. The key trick here is that if you link Part A to Part B and also want Part B to Link Back to Part A, you need two records in Part_Alternates, one with the Values in the PartNumber fields swapped. Creating the second number can be scripted so that when you link A to B, it also links B to A.
I finally managed to get my hands on it and tried the second option. This works but only with two parts (one original and one alternative). When I have three then this doesn't work anymore.
I believe I should try the first option now? Or is there another solution?
If you list each part in that field separated by a return, it will match to more than one related record, but feel free to set up a join table instead as that's generally a more flexible option for this kind of thing.