Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: помогите с проектом (БД) Добавлено: 29.06.08 02:40  

Автор вопроса:  __Pavel__ | Web-сайт: ммм.сайта.НЕТ
Привет всем!

я тут БД начал изучать, пишу проект Тест v3.0 до этого обе версии были без использования БД... решил усовершенствовать =)

итак есть файл Access(каждый тест хранится в отдельном файле) в нем 2 таблицы:
Config(настройки теста) и Questions(все вопросы), поля:
N - номер вопроса
V - вопрос
V1, V2, V3, V4 - варианты ответа
PV - правильный вариант
I1, I2, I3 - изображения к вопросу

загвоздка в поле N... например пользователь создал 5 вопросов(при создании нового вопроса его номер = количеству вопросов в таблице + 1) поле N равно 1, 2, 3, 4, 5, а потом пользователь удаляет 4 вопрос и создает еще один и поле N становится 1, 2, 3, 5, 5... вот вам и ошибка... следовательно нужно при удалении записи как-то восстанавливать поле N, я предложил, на другом форуме, вручную в цикле понизить номера вопросов, выше удаленного, на один ниже, но мне сказали это глупо... хотя другого способа нет.
Вот еслибы можно было бы в SQL запросе обратиться к строке по ее номеру, а не по ключу(поле N), тогда вобще бы отпала нужда в поле N... можно так сделать?

если есть другие решения моей проблемы говорите!
Спасибо!

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 29.06.08 04:00
Действительно это глупо.
1)
В таблице грубо говоря нет начала и конца, т.е. нету никакого номера записи, а есть идентификатор записи.
  Для добавление нового вопроса, тип поля в котором хранится идентификатор вопроса, ставится в "автоматический счетчик" (В MySQL - auto_increment, в MSSQL - IDENTITY_FIELD, как в Accsess'e - не_помню)


2) Я бы советовал сделать всё в одном файле mdb. А ещё лучше сразу какую-нибуть более серезную БД взять советовал бы...

3) Ввести таблицу пользователей, с полями:
idUser, UserName

4) К таблице вопросов, добавить поле idUser, которое будет указавать на пользователя который создал этот вопрос.

Ответить

Номер ответа: 2
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #2
Добавлено: 29.06.08 17:00
to HACKER
1) ничего не понял =)
2) я использую файл Access 2007, незнаю что может быть серьезней и более простым в плане пользования... SQL сервер не подойдет, т.к. его нужно устанавливать на каждом компьютере пользователя(кажется), а мой тест преднозначен для работы по лок. сети.
В одном файле нельзя сделать все, объясню:
например пользователь написал тест и скинул его в интернет, а другой скачал и пользуется им, а в случае когда все тесты в одном файле такого сделать нельзя будет.
да и размер файла тогда будет мягко сказать большим =)
3) насчет пользователя... может быть... вот только где их регистрировать??? на сервере нет пользователей только пароль... вобщем учтем

так чтоб вы и другие были в курсе дела вот Тест v2.0.2.0 ошибки все что я нашел исправил, полностью рабочая версия, все ее минусы я уже услышал на другом форуме(найдете еще пишите):
1) шрифт убрать
2) подсказки нормальные сделать
3) кнопку "Начать тест" сделать более видимой, а то почемуто ее все не могут сразу найти =)
4) выбирать вариант при клике на ячейку варианта ответа а не только на ссылку.
а так нормально =)

ссылка: http://kbyte.ru/service/redirect.aspx?url=http%3a%2f%2fkingly.ifolder.ru%2f7029065
размер на сервере: 1.2мб
пароль для скачки: 321654987
стандартный пароль к серверу: 321654987

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 30.06.08 18:54
Попробую ещё раз, пожалуй последний...

1) В таблице НЕТУ НОМЕРОВ ЗАПИСИ. Понятие номер записи не существует. Нумеровать записи (вопросы) в таблице НЕ НАДО.

1.1) У вопроса может быть только идентификатор. В столбце с идентификатором вопроса, не обязательно числа будут идти по порядку.

1.2) Научится работать с идентификатором. Это я про IDENTITY_FIELD или auto_increment. Вообщем автосчетчик.

2) Если нету привязки вопроса к тому кто его создал. То конечно, таблица юзеров не нужна. Я думал что тебе нужно учитывать автора вопроса.

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 01.07.08 19:55
__Pavel__, восторженые зрители ждут тебя по адресам:
http://vbnet.ru/forum/show.aspx?id=167726
http://vbnet.ru/forum/show.aspx?id=170297

Дайте угадаю, сейчас отвечу и некто __Pavel__ опять начнет игнорировать тему?

1) Храни все тесты в одной базе данных
2) Насчет того какую СУБД лучше использовать - если есть возможность установить ее на сервере - то безусловно SQL Server 2005 Express. Если СУБД нужно обязательно держать на клиенте (хотя это совсем нелогично - студент взломает ее за 5 минут), то лучше всего SQL Server Compact Edition - он "весит" всего 1.7 мегабайт!
3) Как уже сказали, получить запись по ее номеру в базе данных не представляется возможным - ввиду особенностей хранения данных в СУБД, и потмоу что СУБД не гарантирует последовательность в которой она будет выдавать данные (если ты, конечно, не используешь сортировку ORDER BY)
4) Схема базы данных конечно тупая. Что, не может быть кол-во вариантов ответа, отличное от 4? Конечно может.

Делают обычно следующие таблицы:

Предметы
|
V
Тесты
|
V
Вопросы
|
V
Ответы

Ну плюс таблица студентов, преподавателей.

5) Зачем тебе каждый вопрос теста получать отдельным запросом? Гораздо проще и быстрее будет - получить сразу весь список вопросов, при необходимости отсортировать (у нас например вопросы выдаются в случайном порядке). И уже из массива в памяти задавать вопросы студентам.

6)
В одном файле нельзя сделать все, объясню:
например пользователь написал тест и скинул его в интернет, а другой скачал и пользуется им, а в случае когда все тесты в одном файле такого сделать нельзя будет.
да и размер файла тогда будет мягко сказать большим =)


А почему бы не хранить все тесты централизовано, чтоб можно было и из интернета, и из локалки проходить?
Про "размер файла" - смешно даже...
На один тест из 100 вопросов уйдет порядка 10-50 кб.

так чтоб вы и другие были в курсе дела вот Тест v2.0.2.0 ошибки все что я нашел исправил, полностью рабочая версия, все ее минусы я уже услышал на другом форуме(найдете еще пишите):

Большое спасибо, очень радостная новость.

Ответить

Номер ответа: 5
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #5
Добавлено: 02.07.08 16:23
Steel Brand
не надо на меня злиться =) я за инет не успел заплатить вот меня и отключили... да еще и на работу устроился времени совсем нет!

так... делать один файл, я еще раз повторю, НЕБУДУ! гораздо удобней иметь каждый тест в отдельном файле.
На один тест из 100 вопросов уйдет порядка 10-50 кб.

вы что смеетесь? допустим даже если к каждому вопросу по одному изображению прицепят...

5) Зачем тебе каждый вопрос теста получать отдельным запросом? Гораздо проще и быстрее будет - получить сразу весь список вопросов, при необходимости отсортировать (у нас например вопросы выдаются в случайном порядке). И уже из массива в памяти задавать вопросы студентам.

в предыдущих версиях так и делал, т.к. там изображения хранились в отдельной папке
а так вопросов может быть 500 + по 3 изображения к каждому вопросу...

2) Насчет того какую СУБД лучше использовать - если есть возможность установить ее на сервере - то безусловно SQL Server 2005 Express. Если СУБД нужно обязательно держать на клиенте (хотя это совсем нелогично - студент взломает ее за 5 минут), то лучше всего SQL Server Compact Edition - он "весит" всего 1.7 мегабайт!

с SQL вообще не работал только начал Access осваивать... знаю что все одно и тоже, но скланяюсь к Access

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 02.07.08 17:25
__Pavel__, зачем ты открывал эту тему на форуме если сам уже решил как все делать?

Ответить

Номер ответа: 7
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #7
Добавлено: 06.07.08 00:19
думал всеже есть способ обратиться к записи по ее номеру в БД, но номера нет... хм...

на другом форуме мне ответили, потом попробую...
Тогда совсем по простому...
Есть таблица - tblQuery
В ней два "столбца" - IDQuery - счетчик, Name - текст
Вы можете добавлять и удалять записи, а еще вы хотите получать определенную запись, но не по
IDQuery, а по порядку - как вы ее визуально видите в этой супер - таблице.
И вот, вы пишите например такой запрос:

SELECT (Select Sum(1) From Query q
Where q.IDQuery <= q1.IDQuery) AS Num,
q1.IDQuery, q1.QueryName AS Name
FROM Query AS q1
ORDER BY q1.QueryName;


И сохраняете его с именем qryA, например.
Потом пишете второй запрос:

SELECT qryA.Name
FROM qryA
WHERE (((qryA.Num)=[@num]));


И получаете скалар.

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 06.07.08 00:22
Тупняк...

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

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 06.07.08 00:22
Не обязательно это должен быть целочисленный идентификатор, я, например, везде использую GUID (uniqueidentifier)

Ответить

Номер ответа: 10
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #10
Добавлено: 06.07.08 00:39
Тупняк...

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


1) тема закрыта!
2) еще раз повторюсь... я полностью согласен что с помощью датасета намного легче редактировать и управлять данными, но таблица может быть большой и поэтому ее нельзя загружать в ОЗУ и приходится обрабатывать данные по одной записи... вот... вобщем разберусь... чем больше ошибок, тем больше опыта =)

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 06.07.08 02:10
Я же предложил вариант - загружать в память (не обязательно в датасет - это далеко не оптимальный вариант в плане быстродействия и нагрузки на память) только список ID вопросов.
То есть делаешь запрос:

SELECT ID FROM Questions WHERE TestID=50


Получаешь список идентификаторов вопросов:

5
7
9
23
26
29
31
40


Загружаешь его в List.
далее можно без проблем узнать идентификатор следующего по счету вопроса и получить по нему нужные данные.
Например нужен нам первый вопрос, берем из списка первый элемент - это 5.
Выполняем запрос:

SELECT TOP 1 * FROM Questions WHERE ID=5


Задаем пользователю вопрос, он отвечает.

Далее нам нужно задать второй вопрос.
Мы берем из нашего списка второй элемент - это 7
Выполняем запрос:

SELECT TOP 1 * FROM Questions WHERE ID=7


и так далее.

На хранение этого списка в памяти потребуется
4*N + O

байт в памяти, где
N - количество вопросов
O - накладные расходы памяти на подддержку самого List(я думаю в пределах пары десятков байт, точнее сказать не могу).

То есть на сотне вопросов этот список займет пол-килобайта.

блин, тяжело........

Ответить

Номер ответа: 12
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #12
Добавлено: 06.07.08 13:44
вот! то что и было нужно! наконецто... спасибо! =)

Ответить

Номер ответа: 13
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #13 Добавлено: 06.07.08 18:10
Так с каждым днем мы приближались к наступлению АК (абсолютной криптографии)...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам