It depends on whether you ever want to change the tag text globally. Of course, you could set a wide UPDATE to Article_Tag , but if you need to do this, the ability to simply update the value in Tag will be easier. Some servers offer automatic updates (for example, ON UPDATE CASCADE in SQL Server), but they are not necessarily cheap (there should still be UPDATE many rows and any indexes).
But if you don't need it , it should be a little faster with the literal in Article_Tag , since it can remove the connection - many times. Obviously index it, etc.
The extra space required for repeated literal is a factor, but disk space is usually cheaper than a faster server.
As for the primary key; if you do not have other data to store, why do you even need a table? You can use DISTINCT on Article_Tag just as easily, especially if Tag should be indexed (so it should be pretty cheap). ( edit . Bill Carvin correctly points out the merits of being able to have matching tags, not just current tags).
source share