Я бы пошел на простой (почти) нормализованный дизайн:
CREATE TABLE lists (
listid serial,
name varchar,
ownerid int references users(userid)
)
CREATE TABLE list_items (
listid int references lists(listid),
value varchar,
date datetime
)
CREATE TABLE permissions (
permissionid serial,
description varchar,
)
CREATE TABLE list_permissions (
listid int references lists(listid),
permissionid int references permissions(permissionid)
userid int references users(userid)
)
CREATE TABLE users (
userid serial,
name varchar
)
Какие индексы создать, будет зависеть от того, какие именно запросы используются чаще всего и как они выполняются. Например, если вы запрашиваете много по спискам и элементам list_items (вероятно), вам нужен индекс по listid и по имени, если вы будете искать по имени.
Просто несколько идей. Надеюсь, они полезны.