My idea would be that you use one table for all games, one entry per game and distributor (or really, one entry per revision of the game, for when the URL changes) so Abe's Oddysee would have four entries; one each from Gamersgate, GOG, Steam, and Impulse. Then you use another table for to create groups of the same game (one row would then contain your id numbers for all Abe's Odysee entries).
When you then cache the full games list, the script reaches the first entry for each game and checks to see which group it's in (a game should only be allowed to be in one group at a time), it then looks up the information for the other entries in that group (if there are any), and subsequently ignores those entries throughout this run.
As for which title to show in the cache, I would suggest looking up which of the entries is the most recently fetched one, and show that one.
Say, in the "all games" table you have this (with more columns and information for pricing, regional availability, and anything else):
[row1]
gameid=1
title=Oddworld: Abe's Oddysee®
store=steam
url=http://store.steampowered.com/app/15700/
lastfetched=2011-01-20 12:00
[row2]
gameid=2
title=Oddworld: Abe's Oddysee
store=gog
url=http://www.gog.com/en/gamecard/oddworld_abes_oddysee
lastfetched=2011-01-25 12:00
[row3]
gameid=3
title=Oddworld: Abe's Oddysee
store=impulse
url=http://impulsedriven.com/abeody
lastfetched=2011-01-30 12:00
[row4]
gameid=4
title=Oddworld: Abe's Oddysee
store=gamersgate
url=http://gamersgate.com/DD-OAO/oddworld-abes-oddysee
lastfetched=2011-02-04 12:00
The reason I asked about multiple entries from the same store being the same game was because I was unsure how the "same game" table would look.
Something like this might work, with extra logic to store multiple numbers in each cell and find a number in a cell containing multiples:
[1]
steam=1
gog=2
gamersgate=4
greenmangaming=null
impulse=3
ea_uk=null
ea_us=null
If you combined the existing entries on the 2nd of february, and hadn't looked through the list since then, it'd look like this today:
[row1]
steam=1
gog=2
gamersgate=null
greenmangaming=null
impulse=3
ea_uk=null
ea_us=null
[row2]
steam=null
gog=null
gamersgate=4
greenmangaming=null
impulse=null
ea_uk=null
ea_us=null
That would show two rows on the web page (one containing the Steam/GOG/Impulse entries with Impulse's game title, and one containing the Gamersgate entry), combining them later would merely merge the Gamergate info into the first entry, and the title shown would be the Gamersgate one (because that one was fetched last).
I'm not sure if this is comprehensible of if I'm just rambling incoherently. I know what I'm thinking, that certainly doesn't mean others can decipher my wording.