I create one table that contains all 20 million tags with a Unique ID which is 99% a integer just counting up. I also add a column sometimes for a counter which every time a tag gets added to an item, I uptick this counter once. Keeps track of how many times I used this tag.
When I tag an item with 20 tags, I create one column for all my tags.
So lets say I have tags
1, 5 8, 20000, 35, 36.
It doesn't matter to me in the database at this moment what they correspond to, but it does matter that I need to make this column as small and easy as possible because with 200000 mil tags and another 2mil items, the database can get huge.
So my method is to insert the tags like so.
1:35:2000:35:5843:34
I then have created methods to where I can find the tags, export them and so on. So the tags above are also now search able through an easy Regex Expression "\d+".
That row of numbers is in one single column for my item and I call the column tags.
I have done this for many sites.
Hope this helps.