Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбрать данные из хитрой базы, Требуется помощь! 
:(
    Опции темы
svug
Дата 10.10.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



База для записей произвольной формы.
Т.е. разные типы записей имеют произвольный набор полей.
Таблицы под каждый тип записи создавать нельзя.
 
Таблица1. Records - список записей
ID              - номер записи
RecTypeID - тип записи

Таблица2. RecField - список полей у типа записи
ID                
RecTypeID   - тип записи
FieldTypeID - тип поля

Для простоты - поля могут быть Строками и Датами:

Таблица3. TextTable 
ID                - 
RecordID     - ID записи(Таб.1)
RecFieldID   - ID поля    (Таб.2)
Text             - данные

Таблица4. TableDateTime
ID                - 
RecordID     - ID записи(Таб.1)
RecFieldID   - ID поля    (Таб.2)
DateTime     - данные

Например:
 Тип записи-человек
 Поля - Имя,Фамилия,День рождения

Надеюсь, понятно объяснил суть. Все таблицы не выписывал, упростил.
Вопросы:
1. Хороша ли структура?
2. Если да, то КАК smile  отсюда выбирать данные. Например, все записи типа человек.
 smile Бьюсь третий день, требуется помощь.

Добавлено @ 12:34 
ещё есть
Таблица0. RecType-Тип записи
ID
Name


....без нее как то непонятно.... smile 
PM MAIL ICQ   Вверх
Coala
Дата 10.10.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.5.2006
Где: Москва

Репутация: нет
Всего: 0



Цитата(svug @  10.10.2006,  13:24 Найти цитируемый пост)
База для записей произвольной формы.
Т.е. разные типы записей имеют произвольный набор полей.
Таблицы под каждый тип записи создавать нельзя.
 smile 
Ты, когда на потолке спишь, одеяло гвоздями прибиваешь, или скотчем клеишь?
PM MAIL   Вверх
Paradox
Дата 10.10.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1135
Регистрация: 18.11.2002
Где: Россия

Репутация: нет
Всего: 1



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

а вообще наверное что то типа такого:
Код

select a.text, b.DateTime from texttable a,TableDateTime b,  RecType c where a.RecordID=c.ID and b.RecordID=c.ID and c.Name = 'Человек'


ЗЫ для чего такая структура то ?



--------------------
---
PM MAIL WWW   Вверх
Orb
Дата 10.10.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 22.1.2006

Репутация: нет
Всего: нет



есть куча книг по базам данных
почитай

Это сообщение отредактировал(а) Orb - 10.10.2006, 13:55
PM MAIL ICQ   Вверх
bas
Дата 10.10.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



Цитата(svug @  10.10.2006,  12:24 Найти цитируемый пост)
Поля - Имя,Фамилия,День рождения

А как из Таблица3. TextTable  выбрать Имя,Фамилия или Фамилия,Имя ?
PM MAIL   Вверх
svug
Дата 10.10.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Цитата(Paradox @  10.10.2006,  13:47 Найти цитируемый пост)
ЗЫ для чего такая структура то ?


Для того что запускает пользователь программу и создает запись "Человек" и поле фамилия - первый случай. Второй- Человек и поля: Ф, И, О, номер паспорта, количество детей, кличка тещи, и т.д. Вот поэтому нужна такая (или другая) структура.  И ещё, если не ошибаюсь, то MSSQLServer ограничивает количество столбцов в таблице 1024. У меня количество типов записи и количество полей в теории не ограничено. Поэтому динамически создавать таблицы - неподходит. Вообще задача чисто теоретическая и для меня крайне занимательная, так что отговорки про скотч и гвозди не принимаются
smile 

"а вообще наверное что то типа такого"
-неа, видимо меня не правильно поняли. Нужен результат вида:

Фамилия       Имя              ДР             ДРТещи
иванов         петя           1.1.2006      2.2.2006
сидоров       иван           3.3.2000      4.4.2006
....

ФИО-текст, ДР-даты, и ещё может быть произвольное количество дат, все они лежат в TableDateTime, но с разными RecFieldID.

Надеюсь, прояснил ситуацию.
PM MAIL ICQ   Вверх
Stampede
Дата 10.10.2006, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: нет
Всего: 144



svug, в такой структуре, как у тебя, получить данные в классическом табличном виде не получится. Вернее, получится, но очень страшной ценой - соединением множества алиасов одной таблицы. Но это и без надобности. Тебе надо в программе (на чем пишешь-то?) просто правильно обрабатывать запросы такого вида:

Код

select Records.ID, TextTable.RecFieldID, TextTable.Text
    from Records join TextTable on Records.ID = TextTable.ID
    where Records.RecTypeID = 'человек'
    order by Records.ID


Такой запрос вернет тебе кучу записей:

Код

...
1234    Имя     Евгений
1234    Фамилия Петросян
1234    Г. р.   1939
1234    Работа  Ходячий клоун
1234    М. ж.   Москва
...
2345    Имя     Кола
2345    Фамилия Бельды
2345    Г. р.   1931
2345    Работа  Исполнитель фольклорных песен
2345    М. ж.   П-о Таймыр
...


Поскольку результаты у тебя отсортированы по ID, то ты можешь смело перебирать все строки подряд, и пока ID один и тот же, заполнять массив свойств объекта значениями из TextTable.text. Как пойдет следующий ID, это будет сигналом, что предыдущий объект полностью сформирован, и нужно инициализировать новый.

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

Так что, как говорится, думайте сами, решайте сами... smile
PM WWW   Вверх
svug
Дата 10.10.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



хорошая мысль, попробую.....

Цитата(Stampede @  10.10.2006,  20:24 Найти цитируемый пост)
страшной ценой - соединением множества алиасов одной таблицы


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

ещё идея: может всё-таки на серваке формировать результат с помощью ХП?? нда... будем думать...

Цитата(Stampede @  10.10.2006,  20:24 Найти цитируемый пост)
на чем пишешь-то? 

C#

PM MAIL ICQ   Вверх
Stampede
Дата 10.10.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: нет
Всего: 144



Цитата(svug @  10.10.2006,  12:21 Найти цитируемый пост)
да, кажется их должно быть столько же сколько и полей, т.е. имеем зависимость от типа записи.


Это-то как раз не страшно, если формировать запрос динамически, из проги. Были бы только метаданные. А вот то, что соединений куча - это фатально. Но, еще раз повторяю, можно обойтись и без табличного представления данных. Условия в данной структуре выражаются несколько иным способом.

Цитата(svug @  10.10.2006,  12:21 Найти цитируемый пост)
ещё идея: может всё-таки на серваке формировать результат с помощью ХП?? 


А вот это как раз приведет к фиксирванию типов - на уровне текстов процедур. Стоило ли тогда огород городить?

PM WWW   Вверх
jack128
Дата 17.10.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 18.5.2005

Репутация: нет
Всего: 4



качаешь отсюда полный сборник статей Тенцера http://podgoretsky.com/ddp.html . Где то там есть описание подобной структуры БД. И сидишь - изучаешь.
PM MAIL   Вверх
svug
Дата 19.10.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



нашел, вроде оно....
http://foxserver.narod.ru/tenser.htm
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1209 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.