Performance of a single table versus single table with jsonb versus multiple tables?
Options


Add another table to store all URLs with a foreign key back to the main table for each
Use a single table and match the URLs with a regular expression
Use a single table and store the URLs in a jsonb column as an array


Overview


Good idea. Totally ok.
If 2 means storing the URLs as a compound text field and processing with a regex, than that's utterly insane. Worst idea of the day insane. ;)
3 is also a very poor idea. Using JSONB to store an array is way overkill.


Conclusion


Store them in a separate table, or
Store them on the same table using a PostgreSQL Native Array Type


Querying

The 1nf-form method.

SELECT t1.*, t2.*
FROM t1
JOIN t2 USING (id)
WHERE t2.url = 'http://someting.example.com/foo';


This is how you query the table with an array type.

SELECT t1.*
FROM t1
WHERE urls @&gt; ARRAY['http://someting.example.com/foo']


Performance implications

Separate-table (1nf) are that 


adding URL's, and updating URLs are faster (you're writing less data).
joining slows things down a bit.


Performance implications for the column-array


Depending on the query, indexing can be more complex.
Adding or updating URLs requires writing the whole row.
Not having to join makes this potentially faster.
Arrays are less supported with ORMs and libraries.


Maintenance


  I need to match rows by the URL. But I'd also like to keep maintenance to a minimum.


Neither of these approaches is less-maintenance. However, for what it's worth, this is an ideal case for using an array. But make sure you normalize urls before you store them.