In case there is no separate table with a list of tags, and arbitrary strings are allowed, use a standard link table between User and Article and with the tag as a string attribute:
+------------------+-----------------+
| Tag_User_Article | Type |
+------------------+-----------------+
| UserId | Integer (PK,FK) |
| ArticleId | Integer (PK,FK) |
| Tag | String (PK) |
+------------------+-----------------+
For allowing multiple tags for the same combination of user and article, just make the Tag
column part of the unique primary key.
In case there is a separate Tag
table, just replace the Tag
column in the above schema by a forgeign key TagId
referencing the Tag table:
+------------------+-----------------+
| Tag_User_Article | Type |
+------------------+-----------------+
| UserId | Integer (PK,FK) |
| ArticleId | Integer (PK,FK) |
| TagId | Integer (PK,FK) |
+------------------+-----------------+
And no, EAV is not required here, and it has nothing to do with the number of users or number of tags. EAV would allow you to define or change the kind of attributes for a user or article (or combinations of both) at run time, maybe with different kind of attributes for each user. In this question, however, one knows there is only one kind of attribute (the tag), and it's value is always a string or always a reference to the tag table.