Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2012, 09:51
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Универсальная модель базы данных

Есть идея, но не хватает опыта для осуществления. Если кому не лень, попробуйте написать, думаю, полезно будет многим.

Суть:
Универсальная база данных для всех (или почти всех) задач. По своей организации похожа на файловую систему.

Сама база состоит из нескольких таблиц
1. Таблица с объектами (файлы или папки)
Состоит из ID, Имени объекта, типа объекта (папка/файл/корень), содержимое (перечислен список дочерних объектов, которые находятся непосредственно внутри текущего)
2. Таблица со свойствами объектов (атрибутов)
ID, ID объекта, тип свойства (строка/картинка/иконка) Имя свойства, столбцы значений в зависимости от типа.

3. Таблица справочник типов (таких таблиц несколько, например одна для справочника типов объектов)
4. Таблица с содержимым
ID, ID объекта, тип содержимого, далее поля в зависимости от типа содержимого (текстовое (МЕМО), картинка, строка)... можно обойтись одним или добавить еще при желании.


Собственно трудность в создании класса, методами которого можно было бы управлять такой моделью. Я начинающий делфист, так что...

Методами класса должно быть можно считать содержимое объекта, дочерние объекты, свойства (атрибуты) объекта.

Смысл идеи в том, что такая модель может быть использована для любой программы, использующей базу данных (само собой небольших размеров, потому что база 10ГБ будет очень долго читаться).

Нужно, например, вам сделать программу для учета инвентарных единиц. Там будут категории единиц (мебель, ПК (а тут есть и подкатегории), стредства гигиены) и сами единицы (файлы в модели, или один файл со списком единиц).
Или у вас есть еще телефонный справочник организации. Можно хранить его базу все в той же базе, создав папки для каждой вашей программы.


Кроме класса с методами для использования должна быть еще программа для администрирования базы данных, которая отобразит базу в виде дерева каталогов (как ShellTreeView) и позволит смотреть и изменять их содержимое и атрибуты, а так же содержимое файлов. Так же которая позволит делать самостоятельные бэкапы нужных категорий (каталогов) и восстанавливать их.


Плюсы такой модели:
Гибкость.
Простота использования.
Не требует от программиста умения работать с базами данных.

Минусы:
Не подходит для баз данных больших размеров.
Будет нуждаться в обслуживании (удалении содержимого удаленных файлов (мало ли по какой причине ссылка на файл удалится, а содержимое останется)).
Ответить с цитированием
  #2  
Старый 16.10.2012, 11:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Нихрена не понял, на кой оно нужно?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 16.10.2012, 11:42
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нужно это для того же, для чего программеры ушли от машинных кодов к языкам высокого уровня. А именно для упрощения работы.

Так же для упрощения администрирования базы.
Ответить с цитированием
  #4  
Старый 16.10.2012, 11:47
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

MS Access?????
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 16.10.2012, 11:48
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Желательно для MSSQL.
Ответить с цитированием
  #6  
Старый 16.10.2012, 11:53
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Сама база состоит из нескольких таблиц
1. Таблица с объектами (файлы или папки)
Состоит из ID, Имени объекта, типа объекта (папка/файл/корень), содержимое (перечислен список дочерних объектов, которые находятся непосредственно внутри текущего)
А в каком виде здесь представлено "содержимое"?
Ответить с цитированием
  #7  
Старый 16.10.2012, 12:02
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А в каком виде здесь представлено "содержимое"?
Не совсем понял вопроса, но приведу пару столбцов для примера на всякий случай

ID / Имя объекта / Тип объекта / содержит объекты (перечисление ИД)
1 / root / root / (2)(3)
2 / Catalog1 / Catalog / (5)
3 / Catalog2 / Catalog / (4)(6)
4 / Catalog3 / Catalog / (7)
5 / File1 / File / Null
6 / File2 / File / Null
7 / File3 / File / Null

И означать это будет, что база содержит 3 файла:
root/Catalog1/File1
root/Catalog2/File2
root/Catalog2/Catalog3/File3
Ответить с цитированием
  #8  
Старый 16.10.2012, 12:08
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Не совсем понял вопроса, но приведу пару столбцов для примера на всякий случай

ID / Имя объекта / Тип объекта / содержит объекты (перечисление ИД)
1 / root / root / (2)(3)
2 / Catalog1 / Catalog / (5)
3 / Catalog2 / Catalog / (4)(6)
4 / Catalog3 / Catalog / (7)
5 / File1 / File / Null
6 / File2 / File / Null
7 / File3 / File / Null

И означать это будет, что база содержит 3 файла:
root/Catalog1/File1
root/Catalog2/File2
root/Catalog2/Catalog3/File3
Т.е. как я понял тип поля "содержимое" будет текстовым? Сразу говорю, что это неправильно. Как ты будешь через SQL-запросы работать с таким полем? Или как контролировать целостность?
Ответить с цитированием
  #9  
Старый 16.10.2012, 12:16
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Т.е. как я понял тип поля "содержимое" будет текстовым? Сразу говорю, что это неправильно. Как ты будешь через SQL-запросы работать с таким полем? Или как контролировать целостность?
Целостность должны контролировать методы класса (который я таки затрудняюсь написать), ну а содержимое будет текстовым (а как иначе поместить туда несколько численных переменных?).
По поводу отбора, тут все просто. Я ведь не зря поместил ИДшники в скобки, искать можно будет по лайку с жестким совпадением (поле содержит "(3)", например).
Ответить с цитированием
  #10  
Старый 16.10.2012, 12:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Целостность должны контролировать методы класса (который я таки затрудняюсь написать), ну а содержимое будет текстовым (а как иначе поместить туда несколько численных переменных?).
По поводу отбора, тут все просто. Я ведь не зря поместил ИДшники в скобки, искать можно будет по лайку с жестким совпадением (поле содержит "(3)", например).
Можешь конечно поизвращаться с именно такой структурой. Но в общепринятом виде вместо поля "содержимое" тебе нужно поле "ParentID" в котором будет указываться "ID" папки в которой находится объект. Тогда получим следующее:
ID / Имя объекта / Тип объекта / ParentId
1 / root / root / Null
2 / Catalog1 / Catalog / 1
3 / Catalog2 / Catalog / 1
4 / Catalog3 / Catalog / 3
5 / File1 / File / 2
6 / File2 / File / 3
7 / File3 / File / 4
Ответить с цитированием
  #11  
Старый 16.10.2012, 13:55
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Можешь конечно поизвращаться с именно такой структурой. Но в общепринятом виде вместо поля "содержимое" тебе нужно поле "ParentID" в котором будет указываться "ID" папки в которой находится объект. Тогда получим следующее:
ID / Имя объекта / Тип объекта / ParentId
1 / root / root / Null
2 / Catalog1 / Catalog / 1
3 / Catalog2 / Catalog / 1
4 / Catalog3 / Catalog / 3
5 / File1 / File / 2
6 / File2 / File / 3
7 / File3 / File / 4

Да да, именно так я и делал раньше для задания иерархии. И в данной модели можно сделать так же. Но вот именно для этой модели лучше использовать предложенную мной структуру ИМХО.

Стыдно, но я не могу вспомнить, почему я пришел к такому выводу. Но пришел я к нему уже в процессе написания класса. Может и ошибся.
Ответить с цитированием
  #12  
Старый 16.10.2012, 13:59
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Сообщение от morebeauty
Гибкость.
Простота использования.
Не требует от программиста умения работать с базами данных.

похоже на маршалинг/сериализацию
то есть например есть objectlist, в нём другие objectlist-ы (типа папки) и объекты(файлы), всю гору объектов можно целиком сохранить/загрузить (xml/json), и без индексов

есть ещё mongo, с индексами, своим языком запросов и нужно запускать отдельный процесс для сервера

оба случая без фиксированной схемы и с любой вложенностью
__________________
>woweook<
Ответить с цитированием
  #13  
Старый 16.10.2012, 14:14
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от morebeauty
Да да, именно так я и делал раньше для задания иерархии. И в данной модели можно сделать так же. Но вот именно для этой модели лучше использовать предложенную мной структуру ИМХО.

Стыдно, но я не могу вспомнить, почему я пришел к такому выводу. Но пришел я к нему уже в процессе написания класса. Может и ошибся.
Мне то всё равно как у тебя всё будет организовано, я просто написал как это правильно/общепринято делается.
Несколько замечаний:
1) Если в твоей структуре удалить например "7 / File3", то потом ещё нужно найти папку в которой этот элемент находился (в данном случае это "4 / Catalog3") и у него редактировать текстовое поле (т.е. прочитать это значение, найти и удалить в нём подстроку "(7)" и потом записать назад этот обновлённый текст), а в правильном варианте ничего этого не нужно делать: удалили элемент "4 / Catalog3" - он автоматически пропадёт из папки "4 / Catalog3".
2) Если например удалить элемент "3 / Catalog2", то либо останутся файлы которые будут теперь нахидиться "нигде". Либо же нужно писать дополнительный код, который будет искать и удалять всё содержимое удалённой папки. В правильном же варианте, можно настроить связи (Relationship) между таблицами либо чтобы все подчинённые элементы автоматически удалялись вместе со своим владельцем, либо запрет удаления владельца который владеет хоть одним подчинённым элементом (т.е. на который ссылается хоть один элемент). Таким образом сохраняется целостность базы данных.
Ответить с цитированием
  #14  
Старый 16.10.2012, 14:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Pyro
похоже на маршалинг/сериализацию
то есть например есть objectlist, в нём другие objectlist-ы (типа папки) и объекты(файлы), всю гору объектов можно целиком сохранить/загрузить (xml/json), и без индексов

есть ещё mongo, с индексами, своим языком запросов и нужно запускать отдельный процесс для сервера

оба случая без фиксированной схемы и с любой вложенностью
Я когда-то интересовался технологией разрабатываемую ТС, которая называется ORM (Object-relational mapping). Даже нашёл несколько реализаций на Delphi ("Bold for Delphi", "ObjectView", "tiOPF", "TMS Aurelius"). Но потом интерес к этой технологии у меня пропал и я так её и забросил...
Ответить с цитированием
  #15  
Старый 16.10.2012, 16:39
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

честно говоря не знаю чем сейчас пользуются в дельфи, в рубях все используют или orm или подобные штуки (вот идеальный случай – описал объекты, отношения, и используешь их) в дельфи как я понимаю это делается через gui

а тс что хочет я не понял, можно взять на самом деле папки и файлы и вместо select использовать findfirst...
__________________
>woweook<
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter