Я обдумываю лучший способ обработки пользователей и учетных записей для веб-сайта.
Каждый пользователь принадлежит одной учетной записи, учетные записи могут иметь несколько пользователей. Таблицы будут MyISAM, поэтому нет никакой ссылочной целостности с применением БД. Каждый пользователь будет иметь право просматривать / добавлять / редактировать свой собственный контент и / или контент всех пользователей той учетной записи, под которой он находится.
CREATE TABLE account (
id INT,
name VARCHAR,
... etc
);
CREATE TABLE user (
id INT,
accountId INT, // references account.id
userName,
etc.
);
Практически каждая другая таблица в БД будет ссылаться на таблицу User. Например.
CREATE TABLE product (
id INT,
userId, // references user.id
name VARCHAR,
details TEXT
.. more stuff
);
CREATE TABLE event (
id INT,
userId INT,
name VARCHAR,
date DATETIME,
..etc
);
Таким образом, чтобы получить продукты, к которым пользователь может получить доступ, при условии, что у него есть разрешение на доступ к своим собственным, это:
SELECT * FROM product WHERE userId = 17;
Чтобы получить продукты, к которым пользователь может получить доступ, если у них есть доступ ко всей учетной записи:
SELECT p.* FROM product p, user u WHERE u.accountId = 3;
Теперь возникает вопрос: было бы лучше иметь поле accountId в продукте, событии и т. Д.?
CREATE TABLE product (
id INT,
userId, // references user.id
accountId, // references account.id
name VARCHAR,
details TEXT
.. more stuff
);
Это устранит необходимость в дополнительном объединении практически для каждого используемого запроса:
SELECT p.* FROM product p.accountId = 3;
Пользователи никогда не перейдут из одной учетной записи в другую, поэтому идентификатор учетной записи всегда будет правильным. Стоит ли добавлять дополнительные требования к хранилищу данных и потерять немного нормализации, чтобы удалить эти объединения из сотен других запросов, которые будет использовать сайт? Еще одна вещь, которую следует учитывать, это то, что пользовательская таблица не будет записываться слишком часто, поэтому вряд ли будут проблемы с блокировкой таблицы при выполнении соединений.