Если бы это были только эти три варианта, я бы выбрал второй вариант и установил бы триггер на удаление из пользовательских файлов, чтобы решить проблему, которую вы пытаетесь решить с третьим дизайном.
Вы 'У нас уже есть веские причины для выбора этого варианта вместо первого, поэтому я не собираюсь повторять это.
Третий дизайн, тем не менее, не очень хорош - непросто увидеть, заблокирован ли файл;Вы должны увидеть, существует ли sharedFileID, если fileID совпадает с тем, который вам нужен, то есть несколько записей на таблицу.Также нехорошо, что вы пропускаете первичный ключ в CheckedOutFiles, так что он также учитывается.
Однако мы, конечно, можем решить эти проблемы.Если бы вы использовали FileID в качестве первичного ключа в CheckedOutFiles, вы бы смогли избежать этих двух проблем - у вас есть значимый первичный ключ, и вы можете легко проверить, заблокирован ли данный файл.
КонечноДаже если вы это сделаете, у вас все равно будет проблема «специального» пользователя.Простой способ, который вы можете использовать для обработки этого, заключается в сохранении фактического пользователя как части вашей таблицы проверки - sharedFileID ссылается на пользователя отдела, в то время как у вас все еще есть ссылка на фактического пользователя, чтобы убедиться, что вы имеете дело с нужным пользователем.
С этими изменениями третий дизайн кажется лучшим - вы резервируете место только для информации о блокировке для файлов, которые фактически заблокированы.
TL; DR: третий дизайн, но с fileID в качествеPK в CheckedOutFiles и определенный идентификатор пользователя как часть CheckedOutFiles для обработки «мета» -использующих.