IT TIP

데이터베이스에 업무 시간 저장

itqueen 2020. 10. 24. 12:09
반응형

데이터베이스에 업무 시간 저장


저는 현재 업무 시간을 데이터베이스에 저장하는 가장 좋은 방법을 찾고 있습니다.

예를 들면 :

비즈니스 A의 운영 시간은 다음과 같습니다.

  • 월요일 : 오전 9시-오후 5시
  • 화요일 : 오전 9시-오후 5시
  • 수요일 : 9am-5pm
  • 목요일 : 9am-5pm
  • 금요일 : 오전 9시-오후 5시
  • 토요일 : 오전 9시-정오 12시
  • 일요일 : 휴무

현재 다음과 유사한 데이터 모델이 있습니다.

CREATE TABLE "business_hours" (
    "id" integer NOT NULL PRIMARY KEY,
    "day" varchar(16) NOT NULL,
    "open_time" time,
    "close_time" time
)

여기서 "일"은 ORM을 통해 코드에서 요일의 선택으로 제한됩니다. 특정 일에 휴업 여부를 테스트하기 위해 open_time과 close_time이 NULL인지 확인합니다. 중간 테이블 (다 대다 관계)을 통해 비즈니스와 관련됩니다.

이 데이터베이스 체계에 대한 제안이 있습니까? 그것에 대해 뭔가 옳지 않은 것 같습니다.


전반적으로 나는 이것에 아무런 문제가 없다고 생각합니다. 외...

  1. 네이티브 프로그래밍 언어가 사용하는 번호 체계를 사용하여 (라이브러리에서) 요일을 정수로 저장합니다. 이렇게하면 데이터베이스 크기가 줄어들고 코드에서 문자열 비교가 제거됩니다.

  2. 이 테이블의 비즈니스 테이블에 외래 키를 넣을 것입니다. 그렇게하면 링크 테이블이 필요하지 않습니다.

그래서 나는 할 것이라고 생각합니다.

CREATE TABLE "business_hours" (
     "id" integer NOT NULL PRIMARY KEY,
     "business_id" integer NOT NULL FOREIGN KEY REFERENCES "businesses",
     "day" integer NOT NULL,
     "open_time" time,
     "close_time" time
)

내 비즈니스 로직에서는 모든 "비즈니스" 에 최소 7 개의 "업무 시간" 이 있다는 제약 조건을 적용합니다 . ( 적어도 Jon Skeet의 말이 맞기 때문에 휴일 시간을 원할 수도 있습니다.) 비즈니스가 휴무일 동안 "업무 시간"을 그냥 두어이 제약을 완화하고 싶을 수도 있습니다.


이 스키마에서 다루지 않는 한 가지 상황은 하루에 여러 번의 개장 기간입니다. 예를 들어 현지 펍은 12 : 00 ~ 14 : 30 및 17 : 00 ~ 23 : 00에 영업합니다.

마티 네와 저녁 공연을 위해 극장 매표소가 열려있을 수도 있습니다.

이 시점에서 같은 날에 여러 항목을 가질 수 있는지 또는 같은 행에 다른 시간을 표시해야하는지 결정해야합니다.

자정을 넘는 영업 시간은 어떻습니까? 바가 19 : 00-02 : 00에 영업한다고 가정 해 보겠습니다. 개장 및 폐장 시간을 테스트하려는 시간과 비교할 수는 없습니다.


저장해야 할 대상과 실제 데이터가 어떻게 생겼는지에 따라 다릅니다.
비즈니스가 특정 시점에 열려 있는지 확인할 수 있어야하는 경우 계획된대로 계획을 쿼리하는 것이 약간 어색 할 수 있습니다. 하지만 더 중요한 것은 다음과 같습니다. 정오 휴무를 준비해야합니까?

일부 옵션은 다음과 같습니다.

  • 당신이 가진 것과 같은 계획이지만 같은 날에 여러 기간을 가질 수있는 옵션이 있습니다. 점심 시간을 제공하지만 사용자에게 프레젠테이션을 위해 주어진 날짜의 영업 시간을 제공하는 쿼리를 실행하는 것은 어색합니다.
  • 비트 맵 스타일 접근법; 9-5의 경우 "000000000111111110000000"입니다. 이 접근 방식의 단점은 특정 단위, 즉 전체 시간 또는 30 분 또는 실제로는 분을 선택해야한다는 것입니다. 세분화 될수록 사람이 데이터를 읽기가 더 어려워집니다. 비트 연산자를 사용하여이 값을 정수 문자열이 아닌 단일 숫자로 저장할 수 있지만 다시 한 번 가독성이 떨어집니다.

Google 데이터 마크 업이 귀하의 데이터를 인식하도록하려면 다음 지침을 따라야한다는 것을 배웠습니다.

https://schema.org/openingHours

http://schema.org/OpeningHoursSpecification 일부 비즈니스에 매우 유용한 "유효한 날짜"가 포함되어 있습니다.

https://schema.org/docs/search_results.html#q=hours

You should be fine without a primary key, unless you are allowing businesses to share the same hours with the join table - interestingly eventually you would have a finite amount of combinations; I'm not sure how many that would be :p

With one of my projects I used the columns:

[uInt]business_id, [uTinyInt]day, [char(11)]timeRange

If you want to support OpeningHoursSpecification then you'll need to add validFrom and validThrough.

Time Range is formatted like: hh:mm-hh:mm

Here's a function that parses it, you can also modify this function to parse just a single open/close, if you keep them as separate columns in the DB.

Out of my experience I would recommend that you allow multiple times within a day, allow for a way to tell if they are explicitly closed on that day, or opened 24 hours or 24/7. I had mine say that if there was a day missing in the DB then the business was closed that day.

/**
 * parseTimeRange
 * parses a time range in the form of
 * '08:55-22:00'
 * @param $timeRange 'hh:mm-hh:mm' '08:55-22:00'
 * @return mixed ['hourStart'=>, 'minuteStart'=>, 'hourEnd'=>, 'minuteEnd'=>]
 */
function parseTimeRange($timeRange)
{
    // no validating just parsing
    preg_match('/(?P<hourStart>\d{1,2}):(?P<minuteStart>\d{2})-(?P<hourEnd>\d{1,2}):(?P<minuteEnd>\d{2})/', $timeRange, $matches);

    return $matches;
}

Might think about factoring in holidays by including additional fields for month of year/day of month/week of month. Week of month has some minor subtlties "last" could for example be week 4 or 5 depending on the year.

참고URL : https://stackoverflow.com/questions/1036603/storing-business-hours-in-a-database

반응형