Different base URIs for different token IDs

Hey George! You can define your own tokenURI function, so you can theoretically make each each tokenId have a different baseURI if you wanted. You could even make them dynamic, but that would be a peculiar use case (for example, returning something depending on block.timestamp).

I think it fell out of fashion, but OZ's ERC721 use to ship with something like this:

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

Looks like there is more discussion here.