Hooking users from one project to the users table

one field with a json array is definitely worse…

your way is okay, but still not the best…

best is a separate table, called project_users, which has one row per contributor or author

CREATE TABLE project_users ( project_id INTEGER NOT NULL , CONSTRAINT project_users_project FOREIGN KEY ( project_id ) REFERENCES projects ( id ) , user_id INTEGER NOT NULL , CONSTRAINT project_users_user FOREIGN KEY ( user_id ) REFERENCES users ( id ) , PRIMARY KEY ( project_id , user_id ) , INDEX user_projects ( user_id , project_id ) , role CHAR(1) NOT NULL /* C = contributor A = author */ );