2012-01-15 2 views
-1

웨어 하우스 구성을위한 데이터베이스가 필요합니다. 지금까지 내가 3 개 테이블이있다 : (1) 많은 레인을 가지고웨어 하우스 용 데이터 모델

  • 창고 (n)를
  • 레인 (1)이 많은 랙 (N)
  • 랙 (1) 많은 선반
있다

이제 각 테이블에는 ID와 설명/이름이 있습니다.

Shelves 테이블에는 stack_id (팔레트)가 포함되어 있으므로 어떤 선반을 가져 왔는지, 그리고 어떤 선반이 비어 있는지, 그리고 어느 스택이 어디에 있는지를 추적 할 수 있습니다.

내 문제 중 하나는 각 레인마다 다른 양의 랙을 포함 할 수 있다는 것입니다. 예를 들어. 레인 A에는 10 개의 랙이 있으며, 레인 B에는 8 개의 랙이 있습니다. 그래서 단순한 매트릭스 (차선 * 랙 * 선반이 작동하지 않습니다)를 설정하십시오.

나는 계산할 수 있어야합니다. 창고 점유, 그리고 물론 특정 스택이있는 곳을 추적 할 수 있습니다.

내 질문은 : 정말이 3 개의 별도의 테이블을 사용해야합니까? 이 작업을 수행하는 더 좋은 방법이 있습니까?

또 다른 질문은 다음과 같습니다. 선택한 이름 (차선, 선반 및 선반)이 올바른지 (나는 영어가 아님).

미리 감사드립니다.

+1

경로를 뒤집어서 "불규칙한 행렬"문제를 해결할 수 있습니다. 선반에는 부모 선반이 있습니다. 선반에는 부모 레인이 있습니다. 레인은 창고에 산다. 그래서 모든 객체는 부모 포인터 만 필요로하고, 하나 이상의 객체가 같은 부모를 가리킬 수 있습니다. 모델의 레벨을 재귀 모델로 결합 할 수 있습니다. 심지어 제약 조건을 적용 할 수 있습니다 (차선은 선반을 부모로 가질 수 없습니다) – wildplasser

+0

하나의 테이블로 그 차선을 사용할 것을 제안합니까? 기본적으로 parent_id 열과 레코드 유형 (웨어 하우스, 레인, 랙, 선반)에 대한 속성? – Roger

+0

네, 그건 기본적으로 요점입니다. 토폴로지에 제약 조건을 두는 재귀 모델 ("랙 당 12 개 이하의 상자")에서 다소 힘들지 만, 대부분의 경우 현실은 그에 대한 충분한 제약을 가할 것입니다. 그리고 네가 네덜란드 인이라면 Veldwijk을 읽어라. – wildplasser

답변

1

레인 수가 다른 랙 수를 가질 수있는 경우 해당 정보를 테이블에 저장하는 것이 좋습니다.

-- Predicate: "Warehouse number <warehouse_num> is called <warehouse_name>." 
create table warehouses (
    warehouse_num integer primary key, 
    warehouse_name varchar(45) not null unique 
); 

-- Predicate: "Warehouse number <warehouse_num> contains lane <lane_num>." 
-- This table allows different numbers of lanes per warehouse. If you change 
-- the data type to, say, varchar(2) or varchar(3), you can accommodate 
-- different lane "names" in each warehouse. For example, one warehouse 
-- might name its lanes "Lane 1" and "Lane 2", while a different warehouse 
-- might use "Lane A" and "Lane B2". 
create table lanes (
    warehouse_num integer not null references warehouses (warehouse_num), 
    lane_num integer not null check (lane_num > 0), 
    primary key (warehouse_num, lane_num) 
); 

-- Predicate: "Lane <lane_num> in warehouse <warehouse_num> contains rack 
-- <rack_num>." 
-- Allows a different number of racks in each lane. 
create table racks (
    warehouse_num integer not null, 
    lane_num integer not null, 
    rack_num integer not null check (rack_num > 0), 
    primary key (warehouse_num, lane_num, rack_num), 
    foreign key  (warehouse_num, lane_num) 
    references lanes (warehouse_num, lane_num) 
); 

-- Predicate: "Rack <rack_num> in lane <lane_num> in warehouse 
-- <warehouse_num> contains shelf <shelf_num>." Allows a different 
-- number of shelves in each rack. 
create table shelves (
    warehouse_num integer not null, 
    lane_num integer not null, 
    rack_num integer not null, 
    shelf_num integer not null check (shelf_num > 0), 
    primary key (warehouse_num, lane_num, rack_num, shelf_num), 
    foreign key  (warehouse_num, lane_num, rack_num) 
    references racks (warehouse_num, lane_num, rack_num) 
); 

-- "Contents" might be a better name than inventory. You might also need 
-- a unique constraint on stack_id. 
-- Predicate: "Stack <stack_id> is stored in warehouse <warehouse_num> in lane 
-- <lane_num> in rack <rack_num> on shelf <shelf_num>." 
create table inventory (
    warehouse_num integer not null, 
    lane_num integer not null, 
    rack_num integer not null, 
    shelf_num integer not null, 
    stack_id integer not null, 
    primary key (warehouse_num, lane_num, rack_num, shelf_num, stack_id), 
    foreign key (warehouse_num, lane_num, rack_num, shelf_num) 
    references shelves (warehouse_num, lane_num, rack_num, shelf_num) 
); 

차선, 선반 및 선반에 번호가 매겨져 있다고 가정합니다. 그렇지 않다면 이름을 사용하십시오. 무의미한 ID 번호 대신 실제 레인 이름, 랙 이름 및 선반 이름을 사용하여 인벤토리에 대한 쿼리는 사람이 읽을 수있는 결과를 생성하기 위해 조인이 필요하지 않습니다. 창고가 물류 센터 일지라도 빠른 속도로 진행될 것입니다.

테이블 사이의 외래 키 제약 조건은 적어도 선반, 랙 등을 식별하는 데있어 매우 높은 수준의 데이터 무결성을 제공합니다. 대부분의 경우에는 한 번만 채워야하며 대부분을 다시 구성해야합니다. 창고의 차선과 선반.

용어 : "차선"은 일반적으로 통로 또는 행이라고합니다. 나는 영어로 차선이라고 불리는 창고에서 한 줄을 본 적이 없지만, 당신이 의미하는 바를 이해합니다. 당신이 이걸 만들면 누구 에게라도 물어 보면 알려줄 것입니다.

관련 문제