2016-08-30 7 views
0

私は主にレポートのためにリレーショナルデータベースを設計しています。リレーショナルデータベースの設計:レポートのテーブルに属性を複製する

  • 車の艦隊(顧客がその車の現在の状態を見たい:ワークショップやランニング、走行距離、自動車メーカー、...)

  • レポートを引き継ぐ2つのレポートがあります。(顧客は、車の工事に手渡されたときに詳細を見たいと思っています:配達日、車内のガスのクオリティ、返却日、工場の名前、車の所有者)。

イメージは、車のテイクオーバーレポートと自動車フリートレポートに表示する必要がある属性を示しています。

私は車の艦隊と車のテイクオーバーテーブルを生成されたレポートの近くに設計しようと考えていましたが、多くの属性がテーブルに重複しています。

私のデータベース設計が自分のユースケースでまだ受け入れ可能かどうか誰かに教えてもらえますか?

enter image description here

答えて

0

どのくらいの頻度でレポートが生成されます。何回か月、1日に数回、数回分を?これらのいずれも、レポートデータの永続的なコピーを保持する保証はありません。この冗長データはスペースの浪費ではなく、データを正確かつ最新の状態に維持するためにDMLを複雑にし、データにエラーが発生する確率を大幅に高めます。

は、car_takeover_reportcar_fleetという名前のビューで、図に示すようなデータを提供します。これにより、レポートジェネレータは必要な最新のデータを、冗長な方法で実際にデータを複製することなく、必要な形式で提供します。

また、各車の現在の状態を格納するテーブルも必要です。テーブルcar_takeover_reportが必要なもののほとんどであるように見えます。、car_ownerおよびcar_makerは、carテーブルとの結合で利用できるため、削除してください。

create table Company(
    ID  int auto_increment primary key, 
    Name varchar() not null, 
    Street varchar() not null, 
    City varchar() not null 
); 

create table Car(
    ID  int auto_increment primary key, 
    Mileage int not null, 
    OwnerID int not null references Company(ID), 
    Make varchar() not null -- Really should be FK to mfgs table 
); 

create table CarStatus(
    ID  int not null primary key, -- one to one to Car table 
    EffDate date not null, 
    ReturnDate date, 
    Fuel int, 
    Workshop varchar() -- Really should be FK to Workshops table 
); 

create view CarTakeoverReport as 
    select s.EffDate as date_of_takeover, s.ReturnDate as date_of_return, 
      c.Mileage, c.OwnerID as owner, s.Fuel as quantity_of_gas, 
      c.Make as car_maker, s.Workshop 
    from Car  c 
    left join CarStatus s 
     on s.ID = c.ID; 

create view CarFleet as 
    select ...; 
+0

ありがとうございます!非常に高く評価 !レポートは毎日生成されます。私はあなたの解決策に固執する – ThomasW

関連する問題