Рекомендуемый дизайн базы данных для связи между рабочим часом и его сотрудниками и их часами - PullRequest
2 голосов
/ 09 октября 2010

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

BusinessHours business_id, day_of_week, start_time, stop_time

StaffHours staff_id, day_of_week, start_time, stop_time

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

Должен ли я хранить их в одной таблице и добавить поле типа 'keeper_id', в котором хранится идентификатор персонала или компании, и поле 'type', в котором хранится 'staff_hours' 'business_hours', чтобы различать два (сотрудник и бизнес могут иметь один и тот же идентификатор, поэтому мне нужно различать)

Но потом я чувствую, что почти вернулся к ИППП ??

Мысли

Ответы [ 4 ]

0 голосов
/ 09 октября 2010

Я думаю об этом больше так:

A table defining Businesses:

create table Businesses
   (
   Business_Id   integer,
   Business_Name varchar(100),
   etc...
   )

A table defining Employees:

create table Employees
   (
   Business_Id   integer,
   Employee_Id   integer,
   Employee_Name varchar(100),
   etc...
   )

A table defining the type of work shifts the businesses will use:

create table Shifts
   (
   Business_Id   integer,
   Shift_Id      integer,
   Shift_Name    varchar(100),
   StartTime     datetime, -- Just the time of day the shift starts
   Duration      datetime,  -- Duration of the shift
   etc ...
   )

Then a table defining the Schedule:

create table Schedule
   (
   Business_Id   integer,
   Shift_Id      integer,
   Employee_id   integer,
   WorkDate      datetime, -- just the date, time comes from Shift table
   etc ...
   )

Then your query to display the work calendar for everyone would be:

select
   b.Business_Name,
   e.Employee_Name,
   s.WorkDate + sh.StartTime                as ShiftStart,
   s.WorkDate + sh.StartTime + sh.Duration  as ShiftEnd,
   etc ...
from
   Businesses b

   JOIN Schedule s
      on ( s.Business_Id = b.Business_Id )

   JOIN Employees e
      on ( e.Business_Id = s.Business_Id
           and e.Employee_id = s.Employee_Id )

   JOIN Shifts sh
      on ( sh.Business_Id = s.Business_Id 
           and sh.Shift_Id = s.Shift_Id )

Затем еще одна таблица для отслеживания фактического времени входа / выхода.

Что-то в этом роде ...

0 голосов
/ 09 октября 2010

Мне кажется, что вы моделируете что-то (персонал, бизнес, что угодно) и его часы.

Так что у меня была бы модель бизнеса, персонала и часов. С моделью часа, имеющей полиморфные отношения с бизнесом, персоналом и всем остальным, вам может понадобиться:

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

Часовая модель будет иметь поля hourable_id и hourable_type, указывающие на бизнес или на учет сотрудников.

0 голосов
/ 09 октября 2010

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

class Business < ActiveRecord::Base
  has_many :hours, :as => :scheduleable
end

class Staff < ActiveRecord::Base
  has_many :hours, :as => :scheduleable
end

class Hour < ActiveRecord::Base
  belongs_to :scheduleable, :polymorphic => true
end

Здесь вы все равно можете использовать STI для разветвления различных часовых функций, если это необходимо.(Примечание: используйте единственное число при наименовании вашей таблицы модели, то есть BusinessHour, а не BusinessHours):

class BuisnessHour < Hour
  validates :some_business_hour_rule
end

И т. Д.Ключевой вопрос с STI заключается в том, что, учитывая то, что я знаю о своем домене, вероятно, я бы добавил много атрибутов / столбцов, специфичных для подкласса, так, чтобы у меня было много пустых столбцов, например, в строке в таблице часов, представляющейобъект StaffHour, который не использует многие специфичные для BusinessHour атрибуты / столбцы?

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

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

РЕДАКТИРОВАТЬ:

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

class Business < ActiveRecord::Base
  def calculate_monthly_cost
    # operates on hours 
  end
end

имеет для меня больше смысла с точки зрения ООП / SRP, чем это:

class BusinessHour < Hour
  def calculate_business_cost
    # operates on business or uses business-specific rule 
  end
end

По крайней мере, это те вопросы, которые вам нужно задатьопределить правильный подход.

0 голосов
/ 09 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...