Реализация многопользовательского приложения |
Здравствуйте, гость ( Вход | Регистрация )
Реализация многопользовательского приложения |
LE0N |
13.3.2009, 20:59
Сообщение
#1
|
Студент Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: 0 |
В общем весьма специфический такой вопросец...
В общем вот у меня имеется таблица users. К этой таблице прикручены ещё таблицы, товары и прочая дребедень. Реализован ли в QT шаблон ActiveRecord ? Как лучше всего организовать логику работы с базой данных ? Вот допустим у меня идёт выборка всех пользователей и в md5 их паролей. После этого нужно всех пользователей вбить в комбо-бокс.... "Авторизовываем" оного. И нужно будет передать авторизованного пользователя в мэйн форму.... Не знаю, понятно ли я объяснил, если будут вопросы - с удовольствием отвечу... |
|
|
Litkevich Yuriy |
13.3.2009, 21:09
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
LE0N |
13.3.2009, 21:26
Сообщение
#3
|
Студент Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата а что это такое? http://en.wikipedia.org/wiki/Active_record_pattern Вот немножко инфы из википедии, но это мелочи. Там ещё можно свои зависимости создавать и прочие навороты. Короче обстракция над слоем базы данных. Очень сильно распространена в вебе. (Я оттуда пришёл ) Остольную инфу можно без проблем получить в гугле.... Цитата т.е. посути вопрос о построении ПО с авторизацией пользователя? Не совсем. Вопрос, скорее всего, абстрактный. Авторизация пользователя - это как пример, реализация которого (авторизация на одной форме, работа оного на второй) будет мне примером. Сегодня пол дня пытаюсь написать прозрачный, читабельный и удобно-рефактурируемый (о как залепил +)) код. |
|
|
Litkevich Yuriy |
13.3.2009, 22:38
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
тогда посмотри темы:
Требуется совет по поводу архитектуры.. Шаблон проектирования Singleton (одиночка) (там обсуждалось и про пользователей) и может быть Система сбора и обработки данных Если какая-то из тем окажатся, вдруг подходящей, соеденю эту тему с ней, но вовсяком случае я думаю ее нужно переносить из Qt, и менять название. |
|
|
LE0N |
13.3.2009, 22:55
Сообщение
#5
|
Студент Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата я думаю ее нужно переносить из Qt Нет. Это косается именно QT на обычном СИшном АПИ или в вебе, на PHP , я бы особо не циклился (тем более там у меня собственный фреймворк написанный). Меня интересует именно как с меньшими трудозатратами осуществить данное действие в QT.... Пока что только коннектится и выполнять запросы умею... А остольное - для меня тёмный лес. Смотрел примеры вроде SQLбраузер, но даже с опытом разборки чужого кода, так и не въехал что к чему. Да и пример там немножко не из той степи.... |
|
|
BRE |
13.3.2009, 23:18
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Цитата я думаю ее нужно переносить из Qt Нет. Это косается именно QT на обычном СИшном АПИ или в вебе, на PHP , я бы особо не циклился (тем более там у меня собственный фреймворк написанный). Меня интересует именно как с меньшими трудозатратами осуществить данное действие в QT.... Пока что только коннектится и выполнять запросы умею... А остольное - для меня тёмный лес. Смотрел примеры вроде SQLбраузер, но даже с опытом разборки чужого кода, так и не въехал что к чему. Да и пример там немножко не из той степи.... Я правильно понял, что ты хочешь, всю работу с БД скрыть за классами? Я почитал по поводу Active record, такого готового решения нет, все нужно делать руками. Ты подробней объясни. |
|
|
LE0N |
14.3.2009, 0:45
Сообщение
#7
|
Студент Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Я правильно понял, что ты хочешь, всю работу с БД скрыть за классами? Я почитал по поводу Active record, такого готового решения нет, все нужно делать руками. Ты подробней объясни. В идеале - да. Не в идеале - вот, допустим, мы имеем таблицу пользователей. Получаем их. В первый раз мы получили поля username,password во второй раз id,username,password. Тип переменной один и тот же (QSqlQuery) а данные в нём разные...Передавать в конструктор только ТО, что нужно, увеличивая число аргументов функции? Если загонять данные через конструктор, то мы заберём оттуда только то, что требуется. А вдруг нам потребуется потом ещё и id ? Переписывать первый запрос? Или, может быть, забирать все данные ? Только нахера забирать тот же blob или bigtext, если они не используются в данном месте.... Короче я не знаю с какой стороны подступиться...В вебе и с скриптами все дела выглядели на много проще... Имеем лоадер. Который подгружает конфиги, коннектится к базе, получает (делает запрос) пользователей... Потом мне нужно передать управление диалогу - в диалоге имеем список пользователей и их пароли. После сверки md5 этих паролей, мне требуется передать управление, опять же, лоадеру, в который должен попасть активный пользователь... Вот как такую хрень организовать ? Добавлять ещё переменные типа *activeUser в форму авторизации оного? И по закрытию этого окна получать его лоадером? И что дальше? получили логин. Ещё один запрос делать для получения дополнительных данных ? Воспитан в лучших традициях и знаю, что это лишняя нагрузка. В общем хочу подойти к этому делу основательно.... Как вы считаете, моразм? Сообщение отредактировал LE0N - 14.3.2009, 0:47 |
|
|
Litkevich Yuriy |
14.3.2009, 9:51
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
LE0N, по твоему описанию нет ничего связанного с Qt, давай лучше обсудим структуру программы, а потом уже детали реализации на Qt, и не в одной теме.
В первый раз мы получили поля username,password во второй раз id,username,password. вот это я не понял, что значит "в первый раз" и "во второй раз"?
|
|
|
BRE |
14.3.2009, 11:57
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Не в идеале - вот, допустим, мы имеем таблицу пользователей. Получаем их. В первый раз мы получили поля username,password во второй раз id,username,password. Тип переменной один и тот же (QSqlQuery) а данные в нём разные...Передавать в конструктор только ТО, что нужно, увеличивая число аргументов функции? Если загонять данные через конструктор, то мы заберём оттуда только то, что требуется. А вдруг нам потребуется потом ещё и id ? Переписывать первый запрос? Или, может быть, забирать все данные ? Только нахера забирать тот же blob или bigtext, если они не используются в данном месте.... Короче я не знаю с какой стороны подступиться...В вебе и с скриптами все дела выглядели на много проще... Я эксперементировал с оборачиванием объектов БД в классы. Посмотрим твой пример с пользователеями... Это можно реализовать двумя способами: 1. Делается класс User, в котором есть переменные для всех полей записи. Конструктор без параметров создает новый объект в памяти (в БД пока ничего не создается); Конструктор с параметром id читает в свои внутреннии переменные все поля из записи с указанным id; Есть геттеры/сеттеры для переменных; Есть метод flush, который в зависимости от конструктора или создает новую запись, или обновляет ее. Выводы: даже если тебе нужно одно поле из записи закеширует все. 2. Делаем класс User, который хранит только id. Конструктор без параметров создает новый объект в памяти и новую пустую запись в БД. Сохраняет id новой записи в себе; Конструктор с параметром id сохраняет этот id в себе; Геттеры на кождое поле выполняют запрос к БД и возвращают значение, сеттеры делаю запросом с сохранением данных в БД. Выводы: если тебе нужно прочитать три поля из записи, будет вызвано три запроса. В принципе первый вариант мне нравиться больше чем второй, но я отказался от обоих. Мне стало лениво описывать каждую запись в свой класс. Причем по хорошему для каждой таблице нужно описать еще класс типа UserTable, в котором описать работу с самой таблицей... В приложении мы постоянно имеет дело с самими таблицами, поэтому я остановился на создании своих моделей и работы через них, т.е. в UserModel можно добавить свои методы: QSqlRecord record( id ); int add( name, password ); int edit( id, name, password ); bool canDelete( id ); int del( id ); Методы add, edit, del - возвращают номер строки, которую нужно сделать активной в view. Имеем лоадер. Который подгружает конфиги, коннектится к базе, получает (делает запрос) пользователей... Потом мне нужно передать управление диалогу - в диалоге имеем список пользователей и их пароли. После сверки md5 этих паролей, мне требуется передать управление, опять же, лоадеру, в который должен попасть активный пользователь... Вот как такую хрень организовать ? Добавлять ещё переменные типа *activeUser в форму авторизации оного? И по закрытию этого окна получать его лоадером? И что дальше? получили логин. Ещё один запрос делать для получения дополнительных данных ? Воспитан в лучших традициях и знаю, что это лишняя нагрузка. В общем хочу подойти к этому делу основательно.... Как вы считаете, моразм? А здесь, мне так кажется, ты зациклился на лоадере. Есть программы, которая работает с определенной конфигурацией. Вводим класс Configuration, который содержит всю информацию для работы. После конструирования MainWindow, запускается диалог выбора пользователя, после выбора пользователя создается и настраивается объект конфигурации и MainWindow начинает работать с этой конфигурацией. Пользователь нажал кнопку закончить работу, объект конфигурации разрушился и открылся диалог выбора пользователя. И т.д. Сообщение отредактировал BRE - 14.3.2009, 11:59 |
|
|
LE0N |
15.3.2009, 20:21
Сообщение
#10
|
Студент Группа: Участник Сообщений: 97 Регистрация: 10.3.2009 Из: Беларусь Пользователь №: 604 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата В приложении мы постоянно имеет дело с самими таблицами, поэтому я остановился на создании своих моделей и работы через них, т.е. в UserModel можно добавить свои методы А от чего наследовать UserModel в случае с работой с базами данных? (QT) Цитата А здесь, мне так кажется, ты зациклился на лоадере Возможно. Просто его я уже реализовал. Вот только передачу указателей на данные из лоадера в приложение не могу придумать как реализовать... Сообщение отредактировал LE0N - 15.3.2009, 21:00 |
|
|
Текстовая версия | Сейчас: 2.1.2025, 20:16 |