Luận văn Xử lý câu truy vấn bằng phép toán đại số kết hợp thời gian

Tại 1 công ty có nhiều phòng ban, mỗi phòng ban có nhiều nhân viên và 1 nhân viên chỉ thuộc 1 phòng duy nhất. Mỗi phòng chỉ có 1 người quản lý và người quản lý chỉ quản lý 1 phòng. Mỗi phòng có nhiều dự án và 1 dự án chỉ được quản lý bởi 1 phòng. Nhân viên có thể tham gia vào nhiều dự án, nhưng chỉ được tham gia vào 1 dự án tại 1 thời điểm duy nhất. Mỗi dự án có 1 nhà quản lý và nhà quản lý có thể quản lý nhiều dự án nhưng tại 1 thời điểm chỉ được quản lý 1 dự án.

pdf17 trang | Chia sẻ: vietpd | Lượt xem: 1275 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Luận văn Xử lý câu truy vấn bằng phép toán đại số kết hợp thời gian, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
LUAÄN VAÊN TOÁT NGHIEÄP Trang 40 PHẦN 3 : THUYẾT MINH CHƯƠNG TRÌNH LUAÄN VAÊN TOÁT NGHIEÄP Trang 41 1- Thiết kế sơ đồ EER Ta xây dựng 1 ứng dụng cho công ty theo các chi tiết cụ thể sau : Tại 1 công ty có nhiều phòng ban, mỗi phòng ban có nhiều nhân viên và 1 nhân viên chỉ thuộc 1 phòng duy nhất. Mỗi phòng chỉ có 1 người quản lý và người quản lý chỉ quản lý 1 phòng. Mỗi phòng có nhiều dự án và 1 dự án chỉ được quản lý bởi 1 phòng. Nhân viên có thể tham gia vào nhiều dự án, nhưng chỉ được tham gia vào 1 dự án tại 1 thời điểm duy nhất. Mỗi dự án có 1 nhà quản lý và nhà quản lý có thể quản lý nhiều dự án nhưng tại 1 thời điểm chỉ được quản lý 1 dự án. 2- Xây dựng cấu trúc dữ liệu : Ta có các lớp đối tượng sau dùng nhập xuất dữ liệu : TEmployeeForm = class(TForm) EmpID : TLabel; Msnv : TEdit; EmpName : TLabel; Tennv : TEdit; InDepartment : TButton; InProject : TButton; Top : TButton; LUAÄN VAÊN TOÁT NGHIEÄP Trang 42 Bottom : TButton; Next : TButton; Previous : TButton; Exit : TButton; Save : TButton; procedure ExitClick(Sender: TObject); procedure InDepartmentClick(Sender: TObject); procedure InProjectClick(Sender: TObject); procedure TopClick(Sender: TObject); procedure BottomClick(Sender: TObject); procedure NextClick(Sender: TObject); procedure PreviousClick(Sender: TObject); procedure SaveClick(Sender: TObject); procedure Init(var point : TNhan_vien); procedure Restore(var point : TNhan_vien); procedure Displayed(point : TNhan_vien); procedure Emp_Sal; private { Private declarations } public { Public declarations } end; TDepartmentForm = class(TForm) DeptID : TLabel; Msphong : TEdit; DeptName : TLabel; Tenphong : TEdit; DeptManager : TButton; Top : TButton; Bottom : TButton; Next : TButton; Previous : TButton; Save : TButton; Exit : TButton; procedure ExitClick(Sender: TObject); procedure DeptManagerClick(Sender: TObject); procedure TopClick(Sender: TObject); procedure BottomClick(Sender: TObject); procedure NextClick(Sender: TObject); procedure PreviousClick(Sender: TObject); procedure SaveClick(Sender: TObject); procedure Init(var point : T_Phong); procedure Restore(var point : T_Phong); procedure Displayed(point : T_Phong); private { Private declarations } LUAÄN VAÊN TOÁT NGHIEÄP Trang 43 public { Public declarations } end; TProject Form = class(TForm) ProjID : TLabel; Msda : TEdit; ProjName : TLabel; Tenda : TEdit; ProjManager : TButton; DeptManageProj : TButton; Top : TButton; Bottom : TButton; Next : TButton; Previous : TButton; Save : TButton; Exit : TButton; procedure ProjManagerClick(Sender: TObject); procedure DeptManageProjClick(Sender: TObject); procedure SaveClick(Sender: TObject); procedure ExitClick(Sender: TObject); procedure TopClick(Sender: TObject); procedure BottomClick(Sender: TObject); procedure NextClick(Sender: TObject); procedure PreviousClick(Sender: TObject); procedure Init(var point : TDu_an); procedure Restore(var point : TDu_an); procedure Displayed(point : TDu_an); private { Private declarations } public { Public declarations } end; Ngoài ra, để quản lý dữ liệu ta còn xây dựng thêm các cấu trúc sau : TTime = array[1..2] of TDatetime; T_EmpRef = ^ TEmpRef; T_DeptRef = ^ TDeptRef; T_ProjRef = ^ TProjRef; T_Salary = ^TSalary; TSalary = Record luong : integer; time : TTime; next : T_Salary; pre : T_Salary; end; TNhan_vien = ^ TNhanvien; TNhanvien = Record LUAÄN VAÊN TOÁT NGHIEÄP Trang 44 msnv : string; tennv : string; p_InDept : T_DeptRef; p_InProj : T_ProjRef; p_DeptManager : T_DeptRef; p_ProjManager : T_ProjRef; p_luong : T_Salary; next : TNhan_vien; pre : TNhan_vien; end; T_Phong = ^ TPhong; TPhong = Record msphong : string; tenphong : string; p_DeptManager : T_EmpRef; p_Dept_Man_Proj : T_ProjRef; p_InDept : T_EmpRef; next : T_Phong; pre : T_Phong; end; TDu_an = ^ TDuan; TDuan = Record msda : string; tenda : string; p_ProjManager : T_EmpRef; p_Dept_Man_Proj : T_DeptRef; p_InProj : T_EmpRef; next : TDu_an; pre : TDu_an; end; TEmpRef = Record time : TTime; next : T_EmpRef; pre : T_EmpRef; ref : TNhan_vien; end; TDeptRef = Record time : TTime; next : T_DeptRef; pre : T_DeptRef; ref : T_Phong; end; TProjRef = Record time : TTime; next : T_ProjRef; pre : T_ProjRef; LUAÄN VAÊN TOÁT NGHIEÄP Trang 45 ref : TDu_an; end; Với cấu trúc dữ liệu trên ta có thể mô hình hoá quan hệ của các đối tượng theo hình dưới đây : Chú thích : [TIME] : là đoạn thời gian, từ thời điểm T1 đến T2 (T1<=T2) tính theo ngày Ví dụ : T1 = 1/1/99 LUAÄN VAÊN TOÁT NGHIEÄP Trang 46 T2 = 31/12/99 Các phần in đậm để xác định thuộc tính đó do đối tượng đó tạo ra trực tiếp qua form nhập từ đối tượng đó. Các phần in nghiêng để xác định thuộc tính đó do đối tượng đó tạo ra gián tiếp qua form nhập từ đối tượng khác. Các cặp mũi tên giống nhau (có nhiều loại mũi tên kích cỡ khác nhau) để xác định các tham chiếu qua lại giữa 2 đối tượng đó. Dưới đây là cấu trúc dữ liệu theo thứ tự của các đối tượng : + Employee + Department + Project LUAÄN VAÊN TOÁT NGHIEÄP Trang 47 Theo hình vẽ trên, ta có 3 loại đối tượng là Employee, Department và Project. Khi đối tượng này được tạo ra, đồng thời từng thuộc tính của đối tượng này (với các loại đối tượng khác) cũng được tạo ra chuẩn bị cho việc xác lập các mối quan hệ cụ thể. Khi sự xác lập mối quan hệ từ đối tượng này (thông qua thuộc tính cụ thể của chúng) đến loại đối tượng khác thì đồng thời cũng tạo ra mối quan hệ từ đối tượng khác đó (thông qua thuộc tính cụ thể của chúng) đến đối tượng này. Do đó, để quản lý các quan hệ giữa các đối tượng động theo thời gian thì mỗi thuộc tính của mỗi đối tượng đều được xây dựng 1 danh sách liên kết kép, trong đó mỗi phần tử của danh sách liên kết kép này đều lưu trữ 1 khoảng thời gian xác định mối quan hệ đó. Các khoảng thời gian trong mỗi thuộc tính được sắp xếp tăng dần và không trùng lắp lên nhau. Do đó khi nhập dữ liệu liên quan đến thời gian, nếu 2 khoảng thời gian trong 1 thuộc tính trùng lắp lên nhau sẽ bị báo lỗi và dữ liệu không được lưu. Mặt khác, ta xây dựng theo mô hình đối tượng nên các mối quan hệ giữa các đối tượng đều sử dụng con trỏ chỉ đến đối tượng khác. a- Employee : Bao gồm 3 thuộc tính là p_luong, p_InDept, p_InProj được tạo ra trực tiếp từ đối tượng này và 2 thuộc tính p_DeptManager và p_ProjManager được tạo ra gián tiếp khi mối quan hệ từ loại đối tượng khác đến đối tượng này được tạo ra. b- Department : Bao gồm 1 thuộc tính là p_DeptManager, được tạo ra trực tiếp từ đối tượng này và 2 thuộc tính p_DeptManageProj và p_InDept được tạo ra gián tiếp khi mối quan hệ từ loại đối tượng khác đến đối tượng này được tạo ra. c- Project : Bao gồm 2 thuộc tính là p_ProjManager và p_DeptManageProj được tạo ra trực tiếp từ đối tượng này và thuộc tính p_InProj được tạo ra gián tiếp khi mối quan hệ từ loại đối tượng khác đến đối tượng này được tạo ra. LUAÄN VAÊN TOÁT NGHIEÄP Trang 48 3- Các thành phần của chương trình : Trước khi tìm hiểu các thành phần của chương trình, ta có thể tóm tắt hoạt động của chương trình qua sơ đồ sau : Theo hình 1 và 2 ta có các thành phần sau : LUAÄN VAÊN TOÁT NGHIEÄP Trang 49 Hình 1 Hình 2 Menu Inputdata bao gồm các chức năng sau : Save Load Employee Department Project Exit Menu Query bao gồm các chức năng sau : LUAÄN VAÊN TOÁT NGHIEÄP Trang 50 Input Process About a- Save : Chức năng này để lưu lại cấu trúc dữ liệu mà được nhập liệu vào từ 3 chức năng Employee, Department và Project. Vì ta xây dựng theo mô hình đối tượng nên ta đã tạo ra các kiểu pointer động để trỏ đến các đối tượng, nhưng khi ta lưu trữ lại mô hình đó trên đĩa sẽ gặp khó khăn khi phục hồi lại dữ liệu và mô hình. Để đảm bảo cho mô hình và dữ liệu được phục hồi hoàn toàn, ta phải biến đổi các pointer động dựa vào ID duy nhất của mỗi đối tượng. b- Load : Chức năng này để phục hồi lại mô hình đã được cất giữ trên đĩa và nạp chúng vào bộ nhớ. c- Employee : Dùng để nhập dữ liệu cho các đối tượng kiểu Employee và các thuộc tính của chúng như sau : Hình 3 Theo hình 3, ta có thể nhập dữ liệu cho mục EmpID và EmpName. Khi nhập dữ liệu mới, lúc này 2 nút InDepartment và InProject không có tác dụng cho đến khi ta nhấn nút Save. Khi nút Save được nhấn thì sẽ kích hoạt một form mới để nhập dữ liệu cho thuộc tính Luong (Hình 4). Theo hình 4, quá trình nhập Luong sẽ kết thúc khi ta nhấn nút Exit, đồng thời trở về form nhập liệu Employee (hình 3). Lúc này các vùng nhập liệu trong form sẽ trống để ta nhập dữ liệu cho đối tượng khác. Do đó để nhập liệu cho mục InDepartment và InProject thì ta phải sử dụng LUAÄN VAÊN TOÁT NGHIEÄP Trang 51 các nút Top, Bottom, Next, Previous để đến đúng đối tượng và khi này các nút InDepartment và InProject mới có tác dụng, cho phép ta nhập dữ liệu quan hệ đến đối tượng Department và Project. Mỗi thuộc tính InDepartment trong Employee (Hình 5) được tạo ra trỏ đến đối tượng Department thì một thuộc tính InDepartment trong Department cũng được tạo ra và trỏ đến Employee với dữ liệu thời gian giống nhau. Tương tự, khi ta tạo ra thuộc tính InProject trong Employee (Hình 6) trỏ đến Project thì thuộc tính InProject trong Project cũng được tạo ra và trỏ đến Employee. Riêng thuộc tính Luong trong Employee được tạo độc lập không quan hệ với các đối tượng khác do đặc trưng riêng biệt của nó. Hình 4 Hình 5 d- Department : Dùng để nhập dữ liệu cho các đối tượng kiểu Department và các thuộc tính của chúng (Hình 7). Với cách thức nhập tương tự như đối tượng Employee, riêng thuộc tính DeptManager (Hình 8) trong Department được tạo ra trỏ đến Employee đồng thời thuộc tính DeptManager trong Employee được tạo ra và trỏ tới Department. LUAÄN VAÊN TOÁT NGHIEÄP Trang 52 Hình 6 Hình 7 LUAÄN VAÊN TOÁT NGHIEÄP Trang 53 e- Project : Dùng để nhập dữ liệu cho các đối tượng kiểu Project và các thuộc tính của chúng như sau (Hình 9). Hình 9 Cũng giống như đối tượng Employee và Department, các đối tượng kiểu Project cũng được tạo ra tương tự. Riêng thuộc tính ProjManager (Hình 10) và DeptManageProj (Hình 11) được tạo ra để lần lượt trỏ đến đối tượng Employee và Department và ngược lại thuộc tính ProjManager trong Employee và DeptManageProj trong Department cũng được tạo ra và trỏ đến Project. Hình 10 LUAÄN VAÊN TOÁT NGHIEÄP Trang 54 Hình 11 f- Input : Chức năng này để nhập câu truy vấn (Hình 12). Hình 12 Theo hình 12 thì có 3 vùng để hiển thị là : - Produced Rule : hiển thị các luật sinh đối với ký tự không kết thúc. - Input Query : hiển thị câu truy vấn đang được thao tác. - Processing Query : hiển thị câu truy vấn đang được xử lý dựa trên vùng Input Query để xây dựng cây cú pháp phục vụ quá trình xử lý câu truy vấn. LUAÄN VAÊN TOÁT NGHIEÄP Trang 55 Ngoài ra, còn có nút OK để chọn luật sinh phù hợp cho ký tự không kết thúc và nút Exit dùng để thoát và hủy toàn bộ quá trình nhập câu truy vấn đó. Thao tác nhập câu truy vấn : ta tô đen ký tự không kết thúc trong vùng Input Query thì tự động xuất hiện trong vùng Produced Rule luật sinh cho ký tự không kết thúc này. Sau đó ta chọn luật sinh phù hợp trong vùng Produced Rule rồi nhấn nút OK. Quá trình lập lại cho các ký tự không kết thúc khác. Quá trình nhập câu truy vấn được hoàn thành khi tất cả ký tự không kết thúc (ký tự hoa) không còn nữa. Ngoài ra, để hỗ trợ việc nhập câu truy vấn chương trình còn xây dựng bảng luật sinh (hình 13) để xem trước khi chọn luật sinh phù hợp bằng cách nhấp nút phải chọn ngoài các vùng hiển thị. Hình 13 g- Process : Chức năng này thực hiện quá trình xử lý câu truy vấn đồng thời trình bày kết quả xử lý câu truy vấn (hình 14). LUAÄN VAÊN TOÁT NGHIEÄP Trang 56 Hình 14 Ngoài ra chương trình còn hỗ trợ việc tham chiếu trực tiếp mối quan hệ của đối tượng đó với các loại đối tượng khác (nếu có) bằng cách trỏ con trỏ vào vùng hiển thị của đối tượng đó (trong hình 14) sẽ hiển thị mối quan hệ. Cụ thể : - Employee (hình 15). - Department (hình 16) - Project (hình 17)