Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Выбрать данные из хитрой базы


Автор: svug 10.10.2006, 12:24
База для записей произвольной формы.
Т.е. разные типы записей имеют произвольный набор полей.
Таблицы под каждый тип записи создавать нельзя.
 
Таблица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 

Автор: Coala 10.10.2006, 12:55
Цитата(svug @  10.10.2006,  13:24 Найти цитируемый пост)
База для записей произвольной формы.
Т.е. разные типы записей имеют произвольный набор полей.
Таблицы под каждый тип записи создавать нельзя.
 smile 
Ты, когда на потолке спишь, одеяло гвоздями прибиваешь, или скотчем клеишь?

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

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

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 = 'Человек'


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

Автор: Orb 10.10.2006, 13:50
есть куча книг по базам данных
почитай

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

А как из Таблица3. TextTable  выбрать Имя,Фамилия или Фамилия,Имя ?

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


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

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

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

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

Надеюсь, прояснил ситуацию.

Автор: Stampede 10.10.2006, 20:24
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

Автор: svug 10.10.2006, 21:21
хорошая мысль, попробую.....

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


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

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

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

C#

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


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

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


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

Автор: jack128 17.10.2006, 17:24
качаешь отсюда полный сборник статей Тенцера http://podgoretsky.com/ddp.html . Где то там есть описание подобной структуры БД. И сидишь - изучаешь.

Автор: svug 19.10.2006, 15:48
нашел, вроде оно....
http://foxserver.narod.ru/tenser.htm

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)