Какая схема таблицы базы данных более эффективна?

StackOverflow https://stackoverflow.com/questions/38791

  •  09-06-2019
  •  | 
  •  

Вопрос

Какая схема таблицы базы данных более эффективна и почему?

"Users (UserID, UserName, CompamyId)"
"Companies (CompamyId, CompanyName)"

ИЛИ

"Users (UserID, UserName)"
"Companies (CompamyId, CompanyName)"
"UserCompanies (UserID, CompamyId)"

Учитывая тот факт, что пользователь и компания имеют отношение один к одному.

Это было полезно?

Решение

Конечно, более ранний вариант более эффективен с учетом этого ограничения.Для получения той же информации у вас будет меньше соединений в ваших запросах.

Другие советы

ну, это немного открытый вопрос и зависит от ваших бизнес-правил.Первый вариант позволяет сопоставить только одну компанию одному пользователю.вы определяете отношение «многие к одному».

Вторая схема определяет связь «многие ко многим», которая позволяет сопоставлять нескольких пользователей нескольким компаниям.

Они решают различные проблемы и в зависимости от того, что вы пытаетесь решить, определяют, какую схему вам следует использовать.

Строго говоря, с точки зрения «транзакций», первая схема будет быстрее, потому что вам нужно зафиксировать только одну строку, чтобы пользовательский объект был связан с компанией, а для получения компании, в которой работает ваш пользователь, требуется только одно соединение. однако второе решение будет лучше масштабироваться, если ваши бизнес-требования изменятся и вам потребуется, чтобы за пользователем было закреплено несколько компаний.

Как всегда, это зависит от ситуации.Лично я бы выбрал ответ номер один, поскольку в нем будет меньше соединений и его будет легче поддерживать.Меньшее количество соединений должно означать, что требуется меньше сканирования таблиц и индексов.

SELECT userid, username, companyid, companyname
FROM companies c, users u
WHERE userid = companyid

Гораздо лучше, чем...

SELECT userid, username, companyid, companyname
FROM companies c, users u, usercompanies uc
WHERE u.userid = uc.userid
AND c.companyid = uc.companyid

Эти две схемы нельзя сравнивать, поскольку они имеют разные отношения. Вероятно, вам следует посмотреть, какова спецификация таблиц, а затем решить, какая из них соответствует необходимым отношениям.

Первый подразумевает, что Пользователь может быть только членом один компания (отношение «принадлежит_кому»).Тогда как вторая схема подразумевает, что Пользователь может быть членом многих компаний (отношение has_many).

Если вы ищете схему, которая может (или позже будет) поддерживать связь has_many, вам следует выбрать вторую.По причине сравните:

//select all users in company x with schema 1
select username, companyname from companies
inner join users on users.companyid = companies.companyid
where companies.companyid = __some_id__;

и

//select all users in company x with schema 2
select username, companyname from companies
inner join usercompanies on usercompanies.companyid = companies.companyid
inner join users on usercompanies.userid = users.userid
where companies.companyid = __some_id__;

У вас есть дополнительное соединение в таблице выбора.Если вам нужна только связь own_to, тогда второй запрос выполняет больше работы, чем должен, и поэтому делает его менее эффективным.

Я думаю, вы имеете в виду «многие к одному», когда речь идет о пользователях и компаниях, если только вы не планируете создать уникальную компанию для каждого пользователя.

Чтобы ответить на ваш вопрос, используйте первый подход.На одну таблицу меньше для хранения уменьшается пространство и ваши запросы будут использовать меньше команд JOIN.Кроме того, что более важно, он правильно соответствует желаемому вводу.Схема базы данных должна описывать формат всех допустимых данных — если она соответствует формату, ее следует считать допустимой.Поскольку у пользователя может быть только одна компания, в вашей базе данных могут быть неправильные данные, если вы используете вторую схему.

Если у Пользователя и Компании действительно есть один к одному отношения, то вам нужна только одна таблица:

(ID, UserName, CompanyName)

Но я подозреваю, что вы действительно имели в виду, что существует один ко многим отношения между пользователем и компанией - один или несколько пользователей от компании, но только один пользователь от компании.В этом случае решение с двумя таблицами является правильным.

Если есть многие-ко-многим отношения (у компании может быть несколько пользователей, а пользователь может быть привязан к нескольким компаниям), то решение с тремя таблицами является правильным.

Обратите внимание, что эффективность на самом деле проблема здесь не в этом.Характер данных определяет, какое решение вам следует использовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top