|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
MS SQL Адаптивная база данных в .NET 4.x10.12.2015, 16:21. Показов 1043. Ответов 9
Метки нет (Все метки)
Пипол, привет!
Пролог: я понимаю что это принципы проектирования нарушает, но чёрт побери - "есть задача - нужно сделать" Body: задача сделать "адаптивную базу данных" на mssql. Понятно что при таком раскладе EF отпадает (ну так же?) и остаётся только чистый ADO.NET. В принципе написать класс "репозиторий" ну и юзать его методы не столь глобальная проблема как шок от словосочетания "адаптивная база данных". Кто то может делал такое? Есть опыт хождения по камням? Есть примеры? Задача: Обрабатывая файл в котором первая строка - имя столбца, а все последующие - значения колонок. Сделать базу данных и добавляя каждый раз новый файл добавлять (по необходимости): новые таблицы, новые колонки, новые значения. Эпилог: если есть у кого-то наработки, примеры или советы касаемые данного вопроса - на пожалейте, поделитесь, помогите. Добавлено через 35 минут Самый наверно режущий глаз вопрос - а как узнать тип данных без явного индикатора? у нас данные в один и тот же момент времени могут иметь 2 состояния: -тип колонки в бд (в том случае если таблица с этим столбцом уже есть в бд (для примера int)) -тип в пришедшем файле (ну предположим что мы божественным образом всё отпарсили и знаем точный тип - double) Ок, и что дальше? Одна таблица, одна колонка и 2 разных типа данных! конвертить к первому или ко второму? и на каких основаниях? Да и вообще как у строки можно определить "точный тип данных"??? В системе же нет стандартного парсера который на основе своей внутренний логики скажет это: short, ushort, int, uint, long, ulong или может double, decimal, float. Как тип данных определить?
0
|
|
| 10.12.2015, 16:21 | |
|
Ответы с готовыми решениями:
9
База данных (PascalABC.NET) База данных MS Access и VB.net Что может содержать база данных по платформе .NET |
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
|
| 11.12.2015, 20:23 | |
|
DarkOrk, интересная задачка.
Грубо говоря, можно сделать таблицу метаданных, на которую будет ссылаться таблица данных. Если принять незначимым вопрос производительности, то в таблице данных можно держать данные в исходном виде, и приводить к реальному уже в клиенте. Таблицу метаданных заполнять по данным, полученным из бажественного парсера. Если через n дней после начала работы в колонке, которую мы посчитали интовой, появится запятая, можно будет просто поменять метаданные, указав в них, что колонка то у нас, оказывается, вещественного типа была. И не надо будет перезаливать ничего, всё учтётся на следующей итерации получения данных из адаптивной базы. Извлечение данных можно организовать приямо из базы, написав хранимую процедуру, которая на основании метаданных поднготовит динамический запрос, в котором создаст временную таблицу, заполит её и выселектит результат клиенту, а клиент покажет это юзеру. В принципе ничего сложного. А ентити тут не нужны, для этого грубоваты, поскольку эта задача не про отвёрточную сборку. Хотя, конечно, можно ради ентитей извратиться через МСБилд, но это будет лишнее. А уж тип данных определить совсем просто, я даже не хочу говорить об этом. Только надо будет дать ющеру возможность переназначить автоматически полученный тип, потому что всего не предусмотреть. Это вступительное задание на работу что ли такое ?
1
|
|
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
| 11.12.2015, 21:11 [ТС] | |
|
Спасибо. А то уже думал некто мне нечего не подскажет.
То есть, таблица метаданных это у нас таблица с типом, той или иной колонки. Таблица данных (в предложенном вами варианте) это просто сборник всего того что залил файлом юзер (без всякой обработке). Когда юзер делает запрос мы генерируем временную табл. на основе типов из метатаблицы и просим бд сразу же начать парсить всё то что когда-то залил юзер и соответственно, добавить это в временную таблу. По завершению чего отправить её клиенту. По части определения типа данных, вы так отписались что или "единственный способ - это явно проверить на все основные типы" или есть какой-то простой вариант о котором я не знаю, а вы не говорите?! По поводу хранения в "первичном" виде. В принципе да.. но... там была ещё подзадача, о которой я не сказал ввиду её неактуальности (если бы мы распарсили данные сразу). Нужно дать возможность изменять данные из клиента в бд. Если бы была таблица в завершённом её виде (в бд) то просто отобразив её в контроле для данных (DataGrid к примеру) мы б имели бы возможность обновить отредактированную строку через UPDATE, но храня нерасспарсеный вариант данных то придётся делать хранимую процедуру которая будет выполнять функции команды UPDATE (постоянно парсить все данные и по переданным параметрам искать и заменять значения), так?
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
||||||
| 11.12.2015, 23:32 | ||||||
|
1
|
||||||
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
| 12.12.2015, 12:01 [ТС] | |
|
Смотри:
-заливка данных в бд (понятно) -табл. с метаданными (понятно; при заливке предварительный анализ и настройка с помощью узера) -парсинг типов (скажем - понятно) -получения данных в клиенте (понятно; преобразуем все данные согласно данным из мета таблицы) -по поводу редактирования бд: Идею я в принципе понял, то есть, по сути как можно сделать - распарсив данные в клиенте, сложить всё в 2 массива для хранения 2х состояний (исходного и отредактированного). Когда пользователь жмякнит но кнопулю СЕЙВ - анализируем 2 массива. Делаем из оригинального "новый который в оригинальном формате будет содержать изменения" и залить его в БД (просто перезаписав все данные в бд на входные данные). Это всё отработает если у БД один юзер. Ну а мы предположим что клиентов работающих с БД от 1 и больше... а как тогда данные то редактировать. Вот мы по моей схеме действий дошли до пункта с перезаливкой данных, а во время нашей работы какой-то другой клиент изменил данные в таблице (может даже и метаданные). Идентификатор то легко сделать - дата последнего редактирования таблицы (и данных и метаданных). А вот как дальше?? Что идти по шагам git-а? Кидать пользователю месадж с "ошибка миграции". Скачивать ещё раз данные из бд, снова парсить, делать сравнительную таблицу, мол "..это в БД удалено! хотите добавить?", а "эта колонка сменила тип данных, "...какой из сохранить?". Или какой-то более простой вариант я из виду упускаю?
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
||
| 12.12.2015, 14:05 | ||
|
Делаешь табличку например DataUnderModifying(sessionID, ID_Type, ID_Data, LastActualTime). Юзер взял данные на редактирование - заносишь данные в эту таблицу. Для каждого редактируемого элемента данных. Пока не закончит - каждые например 10 секунд обновляешь поле LastActualTime с помощью GetDate() - временем сервера то есть. Пусть у тебя джоба удаляет устаревшие записи из этой таблицы, например старше 20 секунд. А когда другой юзер просит показать ему данные в клиенте - даёшь ему либо с полным доступом, либо в явном виде read only.
1
|
||
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
| 12.12.2015, 15:06 [ТС] | |
|
Суть понял. Чуть конкретнее о таблице под кодовым именем DataUnderModifying.
sessionID - какой нить идентификатор текущей операции редактирования ID_Type - тип операции read/write ID_Data - имя таблицы которая сейчас "под воздействием клиента" LastActualTime - время когда эта операция последний раз дёргалась (Первый раз когда клиент её запросил и до тех пор пока не вернёт обновляем статус каждые 10 сек, если джоб находит строку с LastActualTime< (GetTime()-00:00:20) удаляем её.) Клиент если просит таблицу - проверяем её наличие в DataUnderModifying и если статус write находим, то только readOnly возвращаем (ну и в клиенте можно авто абдейт сделать). Если не находит то ридОнли с возможностью включить редактирование. Можно ещё колонку добавить LastModifyedTime, да бы клиент который в статусе ридОнли с автоАбдейтом не каждые 10 сек перезаливал данные, а только если его внутренний флаг LastUpdateTime отличается от LastModifyedTime. Всё правильно пронял? Что то перепутал?
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
||||
| 12.12.2015, 17:55 | ||||
|
Вероятность того, что два юзера будут одновременно править одни и те же данные гораздо меньше, чем вероятность того, что два юзера одновременно будут.
0
|
||||
|
20 / 19 / 9
Регистрация: 06.02.2015
Сообщений: 382
|
|
| 12.12.2015, 18:54 [ТС] | |
|
Хм, а как ты предлагаешь обновлять 1 запись в какой-то таблице? поскольку мы остановились на варианте хранения исходных данных в "исходном варианте", по даже редактируя одну запись, по окончанию манипуляций, нам понадобится залить всю таблицу (с одной изменённой записью), а юзеру (второму) забрать её, распарсить (снова, т.к. первый вариант у него уже на руках) и взять себе это изменение. Идентификатор у каждого картежа конечно же есть, но таблица в БД у нас (утрируя) это просто набор байтов (ну там это строка будет, но т.к. мы её парсим только в клиенте, то для БД это просто некие данные.
Я подумал а варианте таком: -2 пользователя скачали таблицы. -1й юзер начал редактировать запись. 2й юзер: запрашиваем права на редактирования всей таблицы: нет - то сообщаем о блоке; да - в таблицу по контролю за модификацией таблиц добавляем запись о клиенте в котором сейчас идёт работа (ну и редактируем) ) -1й юзер закончил редактирование - удаляем запись в таблице модификаций (тут получается джоб не на 20 сек нужен, а на 30-60 (в случае если давно ответа нет от клиента). Каждый клиент отчитывается о своём состоянии). Блин... а это получается очень большой объём данных придётся обрабатывать из за одной записи. А как ты предлагаешь одну запись менять?? -Идентифицировать -сохранить в бд в исходный формат таблицы -получить одну запись, на втором клиенте, из таблицы в исходном формате.
0
|
|
|
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
|
||||
| 13.12.2015, 01:10 | ||||
|
Или ты думаешь, что юзер разом будет редактировать всю таблицу, а не её малую часть? Если таблица такая маленькая, к чему тогда всё это ?
0
|
||||
| 13.12.2015, 01:10 | |
|
Помогаю со студенческими работами здесь
10
Как сделать, чтобы в программе на C#.NET открывалась база данных Access (*.mdb)? Как сделать, чтобы в программе на VB.NET открывалась база данных Access (*.mdb)?
Оптовая база: База данных! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|