0

Я смотрю на существующую схему базы данных, и я немного запутался в отношении 1: 1 realtionship в примере ниже:Почему у вас соотношение 1: 1 - дизайн базы данных?

Event 
----- 
id int (PK) 
Title varchar 
Description varchar 
OrganizerId int (FK) 


EventSchedule 
------------ 
id int (Pk) 
EventId int (FK) 
Start datetime 
End datetime 
RepeatRule varchar (ical format for repeating events) 

Venue 
----- 
id int (PK) 
EventId (FK) 
Name varchar 
Address1 varchar 
Address2 varchar 
City varchar 
Region varchar 
Postcode varchar 
latitude float 
longitude float 

Событие только когда-либо происходит в одном месте, так что есть 1 : 1 между Событием и Местом. Аналогично, событие имеет отношение 1: 1 к EventSchedule - правило повторения повторяет повторяющиеся события.

Будет ли какая-либо причина или экземпляр для разделения таблиц как это? Что было бы неправильно в том, одну таблицу следующим образом:

Event 
----- 
id int (PK) 
Title varchar 
Description varchar 
OrganizerId int (FK) 
Start datetime 
End datetime 
RepeatRule varchar (ical format for repeating events) 
Venue varchar 
Address1 varchar 
Address2 varchar 
City varchar 
Region varchar 
Postcode varchar 
latitude float 
longitude float 

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

+1

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

+0

Как упоминалось в fvu, маловероятно, что в качестве места проведения будет использоваться только один раз. Его также наилучшая практика (3-я нормальная форма) для разделения всех типов сущностей. С надлежащей нормализованной базой данных будущее развитие и гибкость будут намного проще. Кроме того, вы сможете устранить сложные запросы при представлении отчетов о своих данных. Если ваши события могут происходить более одного раза и в разных местах, я бы зашел так далеко, как создать 3 таблицы. EventType (информация о событии, такая как описание, имя и т. Д.), События (взаимосвязь между местом и EventType, датами, конкретными деталями события и т. Д.) И местами. –

+0

@fvu В таблице Местоположения содержится FK EventId, его соотношение 1: 1. Событие не может состояться в нескольких местах - если бы оно было тогда, оно было бы классифицировано как другое событие и новая запись для созданного. Если есть другое событие, которое происходит в том же месте, новая запись будет вставлена ​​в таблицу места с теми же адресами. Так как это будет использовать одно и то же место? Аналогично, если событие имеет место более одного раза, детали будут включены внутри правила повторного воспроизведения, т. Е. Не было бы необходимости создавать строку в таблице EventSchedule для того же события. – adam78

ответ

0

Две причины, по которым я могу думать, нормализовать таблицу таким образом:

  1. У вас есть ORM, который работает на EventSchedule/Venue, и только редко вас интересует название события, например
  2. Миграции быстрее. Подумайте, что у вас есть 1M строк, и вам нужно добавить еще одну строку в таблицу событий из предлагаемого решения. Ваша миграция заблокирует таблицу в течение очень долгого времени. Миграция таблиц с меньшим количеством строк выполняется быстрее.
+0

Если я использую entityframework и имею форму для создания/редактирования события (форма будет отображать поля из всех 3 таблиц), мне пришлось бы обновить 3 таблицы, увеличив уровень сложности без какой-либо реальной стоимости. Если я выполняю запросы для поиска события по местоположению и датам, мне нужно добавлять дополнительные объединения, опять же без какой-либо реальной выгоды? Вы отмечаете миграцию и производительность, но не учитываете, что все 3 таблицы будут иметь равное количество строк - соотношение 1: 1. Если я добавлю строку в таблицу событий, в бизнес-правилах будет указана соответствующая строка в двух других таблицах. – adam78

1

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

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

И поскольку площадки, вероятно, будут повторно использоваться для разных событий, я бы разработал таблицу места и таблицу EventVenue, чтобы избежать повторения всех адресов и данных GPS.

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

Еще одна причина для разделения состоит в том, что многие люди предпочитают моделировать, основываясь на том, что логически падает.

Еще одна причина для разделения состоит в том, что таблицы с меньшей шириной имеют тенденцию быстрее запрашивать (особенно если вам не нужно всегда запрашивать другую информацию), и иногда все поля вместе составляют таблицу, которая чем эффективный размер строки для записи SQL Server. Если выполняется максимальный размер каждого поля, что может привести к тому, что вы не сможете добавить эти записи в эту таблицу, даже если SQL Server позволит вам создать его.

+0

вариант использования заключается в том, что организатор при создании мероприятия должен предоставить место и адрес. Я признаю, что места могут быть перенесены для разных событий, но так как разные организаторы создают события, один и тот же eventid/record не может использоваться для событий, создаваемых другими организаторами. В противном случае, в любое время, когда организатор решает отредактировать событие и изменить информацию о месте проведения, это изменение будет каскадным для каждого другого события, использующего один и тот же идентификатор места, который не будет предполагаемой функциональностью. Обратите внимание, что место проведения/адрес вручную создается организаторами. Это не таблица поиска. – adam78

+0

вы можете предоставить схему для вашего предложения о начале старта даты, так что прошлые события будут поддерживать старую версию адреса, а новые будут использовать текущий адрес, пожалуйста, – adam78

+0

обратите внимание, что место/адрес/gps выполняется с помощью поиска по адресу google. Хранение их в таблице места проведения, чтобы избежать повторения всех данных адреса/gps, не соответствовало бы функциональным требованиям бизнеса, так как вряд ли оно будет использоваться в качестве справочной таблицы, потому что оно будет содержать только адреса для ранее созданного события. Проводка в качестве справочной информации наряду с поиском адресов google не будет иметь никакой цели. Я думаю, что вы просто смотрите на это с точки зрения базы данных, а не на реальное функциональное приложение реального мира. – adam78

1

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

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

0

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

Каждый из них был бы лучше изолирован, если бы у них были свои собственные таблицы, с обменом сообщениями между службами, используемыми для связи требуемых данных.