Предотвращение дубликатов при разработке отношения «Один ко многим»

#sql-server #database #database-design #one-to-many #duplicate-data

#sql-сервер #База данных #база данных-проектирование #один ко многим #дубликат-данные

Вопрос:

Я просмотрел множество потоков и не смог разобраться. Извините, если это дублирующий вопрос. Рассмотрим следующую настройку.

1) Сотрудник => (идентификатор, имя)

2) Отдел => (идентификатор, имя, местоположение, клерк, бухгалтер,менеджерсреднего звена,менеджер группы,региональныйменеджер,Активный)

В отделе может быть много клерков, бухгалтеров, менеджеров среднего звена и так далее. Это просто сотрудники из таблицы Employee. Нужна лучшая схема базы данных (гибкая, например, добавление нового столбца в качестве Divisional-Manager должно быть простым) для объекта Department без дублирования данных, БЕЗ аномалий обновления и без таблиц соединений.

Заранее спасибо! 🙂

Ответ №1:

Вам нужно что-то вроде этого;

ошибка сотрудника отдела

 CREATE TABLE department(
    dept_id      int    NOT NULL,
    dept_name    char(10)    NULL,
    CONSTRAINT PK1 PRIMARY KEY NONCLUSTERED (dept_id)
)
go


CREATE TABLE department_employee(
    id         int    NOT NULL,
    dept_id    int    NOT NULL,
    emp_id     int    NOT NULL,
    CONSTRAINT PK3 PRIMARY KEY NONCLUSTERED (id)
)
go


CREATE TABLE employee(
    emp_id      int    NOT NULL,
    emp_name    char(10)    NULL,
    CONSTRAINT PK2 PRIMARY KEY NONCLUSTERED (emp_id)
)
go


ALTER TABLE department_employee ADD CONSTRAINT Refdepartment1 
    FOREIGN KEY (dept_id)
    REFERENCES department(dept_id)
go

ALTER TABLE department_employee ADD CONSTRAINT Refemployee2 
    FOREIGN KEY (emp_id)
    REFERENCES employee(emp_id)
go
  

Комментарии:

1. НЕТ> Я не могу этого увидеть. 🙁

2. Нам действительно нужен идентификатор для department_employee? А также пропустил должность, которую он занимает в этом отделе. ИТАК, у нас может быть мастер позиции / заголовка и включить это также в department_employee . Кстати, спасибо за публикацию объяснения в тексте, учитывая мою неспособность просмотреть изображение.

3. Нет, вам не нужен этот идентификатор. Вы можете использовать dept_id и emp_id в качестве PK этой таблицы. Должность / title является атрибутом этой таблицы department_employee. Вы можете создать ПОЗИЦИЮ таблицы (pos_id, pos_name) и иметь pos_id в таблице department_employee в качестве FK.

Ответ №2:

У вас есть отношения «многие ко многим», поэтому вам нужна третья таблица ассоциаций (junction) — вы не можете этого избежать.

DepartmentMember => (DepartmentID, EmployeeID, MembershipRole)

Почему вы этого не хотите?

Комментарии:

1. Это означает, что мне также нужна таблица MembershipRole?

2. MembershipRole — это просто значение для определения того, является ли это клерком, менеджером и т.д… Это может быть символ, int или varchar, все, что вы считаете самым простым.

Ответ №3:

 Employee =>(ID,name, department_ID, position_ID, Active)
Position =>(ID, name, Active)
Department => (ID,Name,location,Active)
  

Комментарии:

1. Если вы хотите, чтобы определенный сотрудник мог работать в нескольких отделах, у вас будут Employee =>(ID,name, position_ID, Active) и Emp_dep_rel => (employee_ID, department_ID)

Ответ №4:

Отдел => (идентификатор, идентификатор сотрудника, местоположение, активный) Сотрудник => (идентификатор сотрудника, имя, должность)

Я думаю, что это был бы гораздо лучший способ организации ваших таблиц. Предполагается, что active является свойством отдела, в противном случае переместите его в таблицу employee.

Комментарии:

1. В этом проекте у вас может быть только один сотрудник в отделе.

2. не так … EmployeeID изменяется …, идентификатор в employee — это идентификатор сотрудника, отличный от идентификатора отдела

3. если вы поместите EmployeeID в таблицу Department, у вас не может быть более одного сотрудника в отделе. Это факт…

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

5. Я сделал, и это работает просто отлично (в access, но это не должно иметь значения). пожалуйста, объясните, в чем, по вашему мнению, проблема.

Ответ №5:

Предполагается, что сотрудник может работать только в 1 отделе. ЕСЛИ нет, то да, вам нужна третья таблица, чтобы избежать дублирования

Сотрудник

 ID, Name, EmployeeType, DepartmentID
(pk on ID, EmployeeType)
  

Отдел

 ID, Name, Active
  

Комментарии:

1. Это плохо дублирует активное поле.

Ответ №6:

Должность / Title очень сильно зависит от контекста отдела. Можно быть региональным менеджером в одном отделе и дополнительно занимать должность консультанта в другом отделе.

Тогда отдел и сотрудник — это «многие ко многим». Сотрудник на должность также относится ко многим. Если вам нужна гибкость, например, добавление нового названия для отдела, таблицы соединений необходимы. Вы не можете избежать этого.

Вы можете обратиться к следующей структуре таблицы для справки:

 Employee 
-----------------------
EmployeeID (PK)
EmployeeName
Active

Department 
-------------------------
DepartmentID (PK)
DepartmenName
Location

Position 
----------------------------
PositionID (PK)
PositionDescription (eg.Clerk, Accountant etc)

EmployeePosition 
----------------------------
EmployeeID  (FK to Employee.EmployeeID )
DepartmentID (FK to Department.DepartmentID)
PositionID (FK to Position.PositionID )
  

Если позиция / заголовок исправлены на
Сотрудник вместо отдела.т.е.
сотрудник, который является клерком и может находиться в
эта позиция относится к одному или многим подразделениям.,
как мы можем это сделать?

Вы имеете в виду, что в крайнем случае многие сотрудники могут иметь свои собственные специальные должности? и они принадлежат многим отделам? Если да, предположим, что идентификатор сотрудника 123 имеет специальное название «The Special One» и принадлежит ИТ-отделу, отделу учета и отделу продаж . Сначала вы создаете этот заголовок (т. е. «Специальный») в Position таблице и получаете Position.PositionID .

Затем вы вставляете 3 записи для Employee.EmployeeID 123 в EmployeePosition таблицу, используя this Position.PositionID и идентификатор отдела ИТ, учетной записи, отделов продаж.

Комментарии:

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

2. Должность / название @soandos очень сильно зависит от контекста отдела. Можно быть региональным менеджером в одном отделе и дополнительно занимать должность консультанта в другом отделе.

3. Тогда отдел и сотрудник — это «многие ко многим». Сотрудник на должность также относится ко многим. Если вам нужна гибкость, например, добавление нового названия для отдела, таблицы соединений необходимы. Вы не можете избежать этого.

4. итак, это было бы так: таблицы были бы следующими: Department=> (DepartmentID,departmentname, active) Employee=>(EmployeeID,name) Employeetodepartment=>(DepartmentID,EmployeeID, position)

5. @soandos => ага. Может быть, я также могу подумать о том, чтобы иметь главную таблицу для позиции / заголовка