I have done this type of thing in the past. The latest evolution of this was to use a json structure in a payload table, a child table with a parent relationship. Effectively, the parent contains the key and the child table is the value.
Here's an example SQL Server schema you could use:
CREATE TABLE [project] (
[id] bigint IDENTITY(1,1) NOT NULL UNIQUE,
[key] nvarchar(256) NOT NULL UNIQUE,
PRIMARY KEY ([id])
);
CREATE TABLE [payload] (
[id] bigint IDENTITY(1,1) NOT NULL UNIQUE,
[project_id] bigint NOT NULL,
[payload] nvarchar(max) NOT NULL,
PRIMARY KEY ([id])
);
ALTER TABLE [payload] ADD CONSTRAINT [payload_fk1] FOREIGN KEY ([project_id]) REFERENCES [project]([id]);
To be honest, I prefer to use Postgres nowadays, but I have drafted this as SQL Server to give you the general idea.