Даталогічна модель даних
При розробці даталогічної моделі даних на основі аналізу функціональних залежностей між атрибутами відношень потрібно використовувати теорію нормалізації. Нормалізація - це розбивка таблиці на двоє чи більше, що володіють кращими властивостями при включенні, зміні і видаленні даних. Остаточна мета нормалізації зводиться до одержання такого проекту бази даних, у якому кожен факт з’являється лише в одному місці, тобто виключена надмірність інформації. Це робиться не тільки з метою економії пам’яті, скільки для виключення можливої суперечності збережених даних. По іншому процес нормалізації можна пояснити як декомпозиція початкового відношення на декілька простіших. Правила декомпозиції: Між атрибутами не повинно бути функціональної залежності. Групування атрибутів не повинно супроводжуватися надмірним дублюванням даних. Склад атрибутів повинен забезпечувати обробку та поновлення їх без ускладнень. В даній базі даних “Довідники” використовуються такі зв’язки: Один до одного (1:1) - у кожен момент часу кожному екземпляру чи атрибуту об’єкта Х відповідає 1 чи 0 екземплярів чи атрибутів об’єкта Y. Наприклад: У базі даних „ Довідники " можна отримати анотацію про книгу тільки за кодом видання цієї книги. Атрибут Код видання є ключовим атрибутом обох об’єктів бази даних, Видання, Анотації. Один до багатьох (1: ∞) - одному екземпляру об’єкта Х відповідає 0,1 чи декілька атрибутів об’єкта Y. Цей зв’язок найпоширеніший в базі даних „ Довідники ”, так як в основному це є база даних по обліку товарів, які продаються та постачаються багатьом користувачам. Товар може бути представлений в наявності в одному екземплярі, або цілою партією. Наприклад: Виробник випускає продукцію різного типу та конфігурації. Це є 1: ∞ об’єктів Виробники, Види товару. Такий зв’язок може мати об’єкт Назви, Вид товару (1) до Виробника (∞). Так як одну назву може мати багато товарів обліку; вид товару (процесори, материнська плата, принтери, факси) вироблено на одному підприємстві. Багато до багатьох (∞: ∞). Даний зв’язок розшифровується як такий зв’язок, що створюється ще додатковий об’єкт, який називається асоціативним. Асоціативний зв’язок виникає при формалізації багато до багатьох. Аналіз визначених вище об’єктів і атрибутів дозволяє виділити об’єкти проектованої бази даних і, прийнявши рішення про створення реляційної бази даних, побудувати її даталогічну модель мовою „Таблиці-зв’язку”:
Рис.6 може 11 – Даталогічна модель бази даних „Довідники” Опис даталогічної моделі в Firebird має вигляд програмного коду, що описує кожний об’єкт таблиці. object SFirms: TDataSource DataSet = Firms Left = 64 Top = 8 end object SMaterials: TDataSource DataSet = Materials Left = 200 Top = 8 end object SArrival: TDataSource DataSet = QArrival Left = 384 Top = 8 end object SMeasuring: TDataSource DataSet = Measuring Left = 72 Top = 64 end object SExpense: TDataSource DataSet = QExpense Left = 432 Top = 152 end object SObjects: TDataSource DataSet = Objects Left = 72 Top = 128 end object SWork: TDataSource DataSet = Work Left = 232 Top = 208 end object IBDatabase1: TIBDatabase Params.Strings = ( 'user_name=sysdba' 'password=masterkey' 'lc_ctype=win1251') LoginPrompt = False DefaultTransaction = IBTransaction1 IdleTimer = 0 SQLDialect = 1 TraceFlags = [] Left = 32 Top = 312 end object IBTransaction1: TIBTransaction Active = False DefaultDatabase = IBDatabase1 AutoStopAction = saNone Left = 120 Top = 312 end object Firms: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'FIRM_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 50 end item Name = 'ADRES' DataType = ftString Size = 50 end> IndexDefs = < item Name = 'RDB$PRIMARY1' Fields = 'FIRM_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'FIRMS' Left = 16 Top = 8 end object Materials: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'MATERIAL_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 50 end> IndexDefs = < item Name = 'RDB$PRIMARY18' Fields = 'MATERIAL_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'MATERIALS' Left = 136 Top = 8 end object Measuring: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'MEASURING_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 10 end> IndexDefs = < item Name = 'RDB$PRIMARY8' Fields = 'MEASURING_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'MEASURING' Left = 16 Top = 64 end object Objects: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'OBJECT_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 255 end item Name = 'INV_NOM' DataType = ftString Size = 50 end> IndexDefs = < item Name = 'RDB$PRIMARY2' Fields = 'OBJECT_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'OBJECT' Left = 16 Top = 128 end object Work: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'WORK_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 255 end> IndexDefs = < item Name = 'RDB$PRIMARY17' Fields = 'WORK_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'WORK1' Left = 168 Top = 216 end object Statement: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'STATEMENT1_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'DIRECTOR' DataType = ftBlob Size = 8 end item Name = 'ZAYAVA' DataType = ftString Size = 50 end item Name = 'OSOBA' DataType = ftBlob Size = 8 end> IndexDefs = < item Name = 'RDB$PRIMARY15' Fields = 'STATEMENT1_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'STATEMENT1' Left = 152 Top = 64 end object QArrival: TIBQuery Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False SQL.Strings = (
'select Arrival.Arrival_id, Arrival.Dates, Materials.Name, Firms.' + 'Name, Arrival.Invoice,'
'Arrival.Invoice_date, Arrival.Amount, Measuring.Name, Arrival.Pr' + 'ice, ' 'Arrival.Suma, Arrival.Provodka, Place.Name, Category.Name' 'from Arrival,Firms, Materials, Measuring, Place, Category' 'where Arrival.Material_id=Materials.Material_id and' 'Arrival.Firm_id=Firms.Firm_id and' 'Arrival.Measuring_id=Measuring.Measuring_id and' 'Arrival.Place_id=Place.Place_id and' 'Arrival.Category_id=Category.Category_id' 'and Arrival.Dates >=:DateBgn and Arrival.Dates <=:DateEnd') Left = 312 Top = 16 ParamData = < item DataType = ftUnknown Name = 'DateBgn' ParamType = ptUnknown end item DataType = ftUnknown Name = 'DateEnd' ParamType = ptUnknown end> end object Presence_: TIBQuery Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False SQL.Strings = ( 'select '
'Presence.Presence_id, Presence.Material_id, Presence.Date_arriva' + 'l,Materials.Name, Firms.Name, ' 'Presence.Invoice, Presence.Invoice_date, Presence.Amount,'
'Measuring.Name, Presence.Price, Presence.Suma, Place.Name, Categ' + 'ory.Name' 'from ' 'Presence, Materials, Firms, Measuring, Place, Category' 'where' 'Presence.Material_id=Materials.Material_id and' 'Presence.Firm_id=Firms.Firm_id and' 'Presence.Measuring_id=Measuring.Measuring_id and' 'Presence.Place_id = Place.Place_id and' 'Presence.Category_id = Category.Category_id') Left = 184 Top = 144 end object SPresence: TDataSource DataSet = Presence Left = 240 Top = 144 end object QExpense: TIBQuery Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False SQL.Strings = (
'select Expense.Expense_id, Expense.Data, Expense.Date_arrival, M' + 'aterials.Name, Firms.Name, Expense.Invoice,' 'Expense.Invoice_date, Expense.Amount, Measuring.Name, '
'Expense.Price, Expense.Suma, Expense.Provodka, Work1.Name, Objec' + 't.Name, Place.Name, Category.Name'
'from Expense, Firms, Materials, Measuring, Work1, Object, Place,' + ' Category' 'where '
'Expense.Firm_id=Firms.Firm_id and Expense.Material_id=Materials.' + 'Material_id and' 'Expense.Measuring_id=Measuring.Measuring_id and' 'Expense.Work_id= Work1.Work_id and' 'Expense.Object_id=Object.Object_id and' 'Expense.Place_id = Place.Place_id and' 'Expense.Category_id = Category.Category_id' 'and' 'Expense.Data >=:DateBgn and Expense.Data <=:DateEnd ') Left = 352 Top = 168 ParamData = < item DataType = ftUnknown Name = 'DateBgn' ParamType = ptUnknown end item DataType = ftUnknown Name = 'DateEnd' ParamType = ptUnknown end> end object Place: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'PLACE_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 100 end> IndexDefs = < item Name = 'RDB$PRIMARY19' Fields = 'PLACE_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'PLACE' Left = 280 Top = 80 end object SPlace: TDataSource DataSet = Place Left = 344 Top = 80 end object Category: TIBTable Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False FieldDefs = < item Name = 'CATEGORY_ID' Attributes = [faRequired] DataType = ftInteger end item Name = 'NAME' DataType = ftString Size = 100 end> IndexDefs = < item Name = 'RDB$PRIMARY20' Fields = 'CATEGORY_ID' Options = [ixPrimary, ixUnique] end> StoreDefs = True TableName = 'CATEGORY' Left = 432 Top = 80 end object SCategory: TDataSource DataSet = Category Left = 496 Top = 80 end object Presence: TIBQuery Database = IBDatabase1 Transaction = IBTransaction1 BufferChunks = 1000 CachedUpdates = False SQL.Strings = ( 'select * from EXPENCEVIEV(0,0)') Left = 128 Top = 176 end
Схема БД облікової системи представлена у вигляді 24 таблиць, основні з яких: “Виробники”, “Види товару”, “Місце розташування товару”, “Внутрішня звітність", “Зовнішня звітність", “Характеристики товару”, “Постачальники", “Оптові покупці" та ін. Представимо у вигляді таблиці назви основних полів та зв’язків між ними -таблиця 3.
Таблиця 3 Основні поля зв’язків між таблицями бази даних системи обліку
Для нормальної роботи БД усі таблиці зв’язані між собою, це забезпечує формування запитів, форм звітів до бази даних. Змоделювавши даталогічну модель БД інформаційної автоматизованої системи обліку товарів комп’ютерної фірми в якій помічена кількість потрібних таблиць, полів та зв’язків між ними починається розробка програмного продукту, в якому буде створюватись база даних.
|