Как разработать универсальную базу данных, расположение которой может изменяться со временем?

Вот хитрый - как я программно создаю и опрашиваю базу данных, содержание которой я не могу действительно предвидеть?

Я реализую универсальную входную систему формы. Пользователь может создать формы PHP с расположением WYSIWYG и использовать их для любой цели, которой он желает. Он может также запросить вход.

Так, у нас есть три этапа:

  1. форма разработана и сгенерирована. Это - одноразовая процедура, хотя форма может быть отредактирована позже. Это разрабатывает базу данных.
  2. кто-то или несколько человек используют форму - говорят для ежедневных отчетов по продажам, хранения запаса, платежной ведомости, и т.д. Их вход к формам записан в базу данных.
  3. другие, возможно, управление, могут запросить базу данных и генерировать отчеты.

Так как эти формы универсальны, я не могу предсказать структуру базы данных - кроме сказать, что она будет отражать поля HTML-формы и состоять из ввод данных от набора окон редактирования, заметок, переключателей и т.п..

Вопросы и комментарии:

A) как может я лучше всего структурировать базу данных, с точки зрения таблиц и столбцов? Что относительно первичных ключей? Моя первая мысль состояла в том, чтобы использовать имя элемента управления для идентификации каждого столбца, затем я понял, что пользователь может отредактировать форму и переименовать, так, чтобы, возможно, "имя" стало "сотрудником", или "заработная плата" становится ": зарплата". Я склоняюсь к уникальному числу для каждого.

B) как лучше всего включить строки? Я думал о метке времени, чтобы позволить мне запрашивать и столбец для идентификатора строки от A)

C) Я должен обработать столбец, rename/insert/delete. Удаление противника, я не уверен, удалить ли данные из базы данных. Даже если пользователь не вводит его от формы еще, он может хотеть запросить то, что ранее вводилось. Или могут быть некоторые законные требования для сохранения данных. Какие-либо глюки в столбце, rename/insert/delete?

D) Для запросов у меня может быть свой опрос PHP база данных, чтобы получить имена столбцов и генерировать форму со списком, где каждая запись имеет имя столбца базы данных, флажок, чтобы сказать, должно ли это использоваться в запросе и, на основе типа столбца, некоторых критериев выбора. Этого должно быть достаточно для создания поисков как "положение = 'главный продавец' и зарплата> 50k".

E) Я, вероятно, должен генерировать некоторые необычные диаграммы - графики, гистограммы, круговые диаграммы, и т.д. для результатов запроса числовых данных со временем. Я должен найти некоторый хороший FOSS PHP для этого.

F) Что еще я забыл?

Это все кажется очень хитрым мне, но я - база данных n00b - возможно, это просто Вам гуру?


Править: не говорите мне не делать это. У меня нет выбора :-(

Править: в реальной жизни я не ожидаю, что столбец, rename/insert/delete, будет частым. Однако возможно, что после выполнения в течение нескольких месяцев изменение в базе данных могло бы требоваться. Я уверен, что это регулярно происходит. Я боюсь, что сформулировал этот вопрос плохо и что люди думают, что изменения будут вноситься волей-неволей каждые 10 минут или около этого.

Реалистично, мои пользователи определят базу данных, когда они разметят форму. Они могли бы получить его в правильный первый раз и никогда не изменять его - особенно, если они преобразовывают из бумажных форм. Даже если они действительно решают измениться, это могло бы только происходить несколько раз когда-либо, после месяцев или лет - и это может произойти в любой базе данных.

Я не думаю, что у меня есть особый случай здесь, ни что мы должны концентрироваться на изменении. Возможно, лучше для концентрации на связи - что такое хорошая схема первичного ключа? Скажите, возможно, для одного ввода текста, одного числового и заметки?

8
задан APC 10 June 2010 в 11:31
поделиться

7 ответов

"Все это кажется мне очень сложным, но я новичок в области баз данных - может быть, для вас это просто для вас, гуру?"

Нет, это действительно сложно. По сути то, что вы описываете, не является приложением базы данных, это конструктор приложений базы данных. На самом деле, это звучит так, как будто вы хотите написать что-то вроде Google App Engine или веб-версии MS Access. Написание такого инструмента потребует много времени и опыта.

Google реализовал гибкие схемы с помощью своей платформы BigTable. Она позволяет изменять схему практически по своему усмотрению. Проблема в том, что такая гибкость делает очень трудным написание запросов типа "должность = "старший продавец" и зарплата > 50 тысяч".

Поэтому я не думаю, что подход NoSQL - это то, что вам нужно. Вы хотите создать приложение, которое генерирует и поддерживает схемы РСУБД. Это означает, что вам нужно создать хранилище метаданных, из которого вы сможете генерировать динамический SQL для создания и изменения схем пользователей, а также генерировать фронт-энд.

То, что должна хранить схема метаданных

Для генерации схемы:

  • отношения внешних ключей (сотрудник работает в ДЕПАРТАМЕНТЕ)
  • уникальные бизнес-ключи (может быть только один ДЕПАРТАМЕНТ под названием "Продажи")
  • справочные данные (допустимые значения EMPLOYEE.POSITION)
  • тип данных столбца, размер и т.д.
  • является ли столбец необязательным (т.е. NULL или NOT NULL). NULL или NOT NULL)
  • сложные бизнес-правила (премии сотрудников не могут превышать 15% от их зарплаты)
  • значения по умолчанию для столбцов

для генерации на стороне

  • отображаемые имена или метки ("Заработная плата", "Зарплата")
  • виджет (выпадающий список, всплывающий календарь)
  • скрытые поля
  • производные поля
  • текст справки, подсказки
  • проверка на стороне клиента (связанный JavaScript и т.д.)

Последнее указывает на потенциальную сложность вашего предложения: обычный дизайнер форм вроде Джо Соупа не сможет сформулировать JS для (скажем) проверки того, что вводимое значение находится между X и Y, поэтому вам придется выводить его, используя шаблонные правила.

Это ни в коем случае не исчерпывающий список, это просто из головы.

Для первичных ключей я предлагаю использовать столбец типа данных GUID. Временные метки не гарантируют уникальность, хотя если вы используете базу данных на ОС, которая переходит в шесть мест (т.е. не Windows), то вряд ли у вас возникнут проблемы.

последнее слово

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

Я уже создавал генераторы схем баз данных. Это нелегко. Одна вещь, которая может быть трудной, - это отладка динамического SQL. Поэтому облегчите себе задачу: используйте реальные имена для таблиц и столбцов. Если пользователь приложения хочет видеть форму с названием HEADCOUNT, это не значит, что нужно переименовывать таблицу EMPLOYEES. Поэтому необходимо отделить отображаемую метку от имени объекта схемы. В противном случае вы будете пытаться выяснить, почему этот сгенерированный SQL-запрос не сработал:

update table_11123
set col_55542 = 'HERRING'
where col_55569 = 'Bootle'
/

Этот путь лежит через безумие.

9
ответ дан 5 December 2019 в 06:36
поделиться

Как сказал Томас, рациональная база данных не годится для вашей проблемы. Однако, возможно, вы захотите взглянуть на NoSQL базы данных, такие как MongoDB.

3
ответ дан 5 December 2019 в 06:36
поделиться

См. эту статью: http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/

для получения чужого опыта решения вашей проблемы.

2
ответ дан 5 December 2019 в 06:36
поделиться

Это для A) и B), и это не то, что я сделал, но подумал, что Reddit использовал интересную идею, см. Эту ссылку (см. Урок 3 ):

http://highscalability.com/blog/2010/5/17/7-lessons-learned- while-building-reddit-to-270-million-page.html

1
ответ дан 5 December 2019 в 06:36
поделиться

Не уверен насчет базы данных, но для диаграмм вместо использования PHP для диаграмм я рекомендую изучить использование javascript ( http://www.reynoldsftw.com/2009/02/6-jquery-chart-plugins -reviewed / ). Преимущества этого заключаются в том, что часть обработки выгружается на клиентскую сторону для отображения диаграмм, и они могут быть интерактивными.

1
ответ дан 5 December 2019 в 06:36
поделиться

По сути, вы спрашиваете, как создать приложение без спецификаций. Реляционные базы данных не были разработаны для того, чтобы вы могли делать это эффективно. Обычным подходом к этой проблеме является конструкция сущности-атрибута-значения, и для типа системы, в которой вы хотите ее использовать, вероятность неудачи составляет почти 100%.

Не имеет смысла, например, что столбец с названием «Имя» мог стать «Зарплата». Как будет отчет, где вы хотите, чтобы общая заработная плата работала, если бы значения зарплаты могли иметь следующие значения: «Фред», «Боб», 100 тыс., 1000, «много»? Базы данных не предназначены для того, чтобы кто-либо что-либо куда-то помещал. Успешные схемы базы данных требуют структуры, что означает усилия в отношении спецификаций того, что необходимо хранить и почему.

Поэтому, отвечая на ваш вопрос, я бы переосмыслил проблему. Весь подход к созданию приложения, которое может хранить что угодно во вселенной, не является рецептом успеха.

7
ответ дан 5 December 2019 в 06:36
поделиться

Другие респонденты правы в том, что с таким подходом следует быть очень осторожным, поскольку он сложнее и менее производителен, чем традиционная реляционная модель - но я делал подобное для учета различий между отделами на работе, и это прекрасно работало при том объеме использования, который получался.

В основном я настроил ее следующим образом: сначала - таблица для хранения некоторой информации о форме, которую пользователь хочет создать (очевидно, корректируйте по своему усмотрению):

--************************************************************************
-- Create the User_forms table
--************************************************************************
create table User_forms
    (
    form_id            integer identity,
    name               varchar(200),
    status             varchar(1),
    author             varchar(50),
    last_modifiedby    varchar(50),
    create_date        datetime,
    modified_date      datetime
    )

Затем таблица для определения полей, которые будут представлены на форме, включая любые ограничения. а также порядок и страницу, на которой они должны быть представлены (в моем приложении поля были представлены в виде многостраничный поток типа мастера).

-

-************************************************************************
-- Create the field configuration table to hold the entry field configuration
--************************************************************************
create table field_configuration
    (
    field_id                integer identity,
    form_id                 SMALLINT,
    status                  varchar(1),
    fieldgroup              varchar(20),
    fieldpage               integer,
    fieldseq                integer,
    fieldname               varchar(40),
    fieldwidth              integer,
    description             varchar(50),
    minlength               integer,
    maxlength               integer,
    maxval                  varchar(13),
    minval                  varchar(13),
    valid_varchars             varchar(20),
    empty_ok                varchar(1),
    all_caps                varchar(1),
    value_list              varchar(200),
    ddl_queryfile           varchar(100),
    allownewentry           varchar(1),
    query_params            varchar(50),
    value_default           varchar(20)
    );

Затем мой perl-код перебирал поля по порядку для первой страницы и помещал их на "форму мастера"... а кнопка "next" представляла поля второй страницы по порядку и т.д.

У меня были функции javascript для обеспечения соблюдения ограничений, заданных для каждого поля...

Затем таблица для хранения значений, введенных пользователями:

--************************************************************************
-- Field to contain the values
--************************************************************************
create table form_field_values
    (
    session_Id        integer identity,
    form_id           integer,
    field_id          integer,
    value             varchar(MAX)
    );

Это было бы хорошей отправной точкой для того, что вы хотите сделать, но следите за производительностью, так как это может действительно замедлить любые отчеты, если они добавят 1000 пользовательских полей :-)

.
1
ответ дан 5 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: