Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

"Динамичные битовые маски"   Найти похожие ветки 

 
{RASkov} ©   (2008-01-10 02:02) [0]

Подскажите пожалуйста алгоритм реализации вот какой задачи:

Есть некая структура, для удобства возмем две таблицы БД.
Собственно в конечном варианте возможно(скорее всего) БД и останется
Пример с таблицами:

1я и 2я таблица должны содержать по одному основному полю("Название"), остальные "внутренние"(служебные)....
Я в БД плохо ореентируюсь, да и то только если примитивный БДЕ, поэтому если что, то "сорь" с БД терминами...

Струтура, в моем понятии, нечто такая:
1 Таблица:
----------------------------------
ID - номер записи
Title - "Название записи"(сумбурно)
CODE  - собственно код характеристик (См. ниже 2 таблицу)
Х - может
Х - и
... для чего-то по этому вопросу нужные поля...
----------------------------------
2 Таблица:
----------------------------------
ID - номер записи(уникальный код записи, например автоинкремент);
NameCharacteristic - название характеристики записи из первой таблицы.
Х - может
Х - и
... для чего-то по этому вопросу нужные поля...
----------------------------------

Как эта структура работает? Объяснить не могу(незнаю), но вот для чего, и как я вижу альтернативное решение:

В первую таблицу "набиваются" записи, например названия книг.
Во второй должны быть характеристики книг (жанры, авторы.... еще чего-то)... таблица набивается паралельно с первой...
Например занесли в первую таблицу книгу с новым жанром, (т.е. с таким жанром еще не было) и паралельно добавили жанр во вторую...

Как я "видел" реализацию: ...Битовые маски и ограниченные(статичные) записи во второй таблице(кол-во характеристик 32 - Integer(32бита)), но хотелось бы именно динамично менять вторую таблицу(имея при этом более 32 записей), причем чтоб при изменениях не нарушалась "связь"....
Записи("Названия") могут редактироваться и в первой и во второй таблицах....
При удалении характеристики(думаю отдельный случай, и тут нужна некая переиндексация чтоли)

Далее в программе будет реализация некоего фильтра:
Изначально отображены все записи первой таблицы. Выбрали во второй например жанр - Стихти - в первой отфильтровались только те записи у которых в CODE "есть код записи"(Стихи) из второй.... и так далее....

Выглядеть в программе будет типа так: при каждом последующем выборе характеристики, будет строиться некий путь характеристик, любое звено которого можно будет исключить из пути, путем удаления из фильтра кода...

FILTRCODE:=FILTRCODE or ID(2 таблица); - добавление
FILTRCODE:=FILTRCODE and not ID(2 таблица); - удаление

Фильтр = CODE(1 таблица) and FILTRCODE = FILTRCODE

Вот собственно все расписал, если что могу дополнить :) Надеюсь было понятно все...
Какие есть предложения по данному вопросу? Вот я наворотил :) Спасибо тому кто осилил это прочитать)


 
{RASkov} ©   (2008-01-10 02:15) [1]

Т.е вопрос именно в алгоритме организации данной схемы фильтра данных...
Пример с книгами - просто пример.... могут быть любые данные...
И не хотелось бы ограничений, на кол-во записей во второй таблице...

Все что я расписал в [0], как я вижу реализацию алгоритма - может быть не верно....
Хотелось бы оптимального, нормального, стабильного решения.... А может оно не так все сложно как мне кажется?
Еще раз Спасибо за внимание.


 
Германн ©   (2008-01-10 02:18) [2]


> {RASkov} ©   (10.01.08 02:02)


> Как я "видел" реализацию: ...Битовые маски и ограниченные(статичные)
> записи

Т.е. множества ты не знаешь? Или знаешь только Паскалевские множества?
Оператор IN в SQL тебе знаком?


 
Anatoly Podgoretsky ©   (2008-01-10 02:24) [3]

А база наверно секретом является. Битовые операции есть в MS SQL и вроде в Оракле, но не советую с этим связывать, проблем будет много.


 
Германн ©   (2008-01-10 02:39) [4]


> Anatoly Podgoretsky ©   (10.01.08 02:24) [3]

Толь. Да не нужны ему "битовые операции".
Его просто нужно отучить использовать фильтр в TTable, а взамен познакомить его с SQL. Он свой, Он поймёт.


 
{RASkov} ©   (2008-01-10 02:40) [5]

> [2] Германн ©   (10.01.08 02:18)
> Оператор IN в SQL тебе знаком?

:(
Я же предупредил про БД... Я в БД как казел в ананасах... знаю примитивную работу с TTable и БДЕ (

> Т.е. множества ты не знаешь?

Знаю.... Но как будет выглядеть это? Я думал об них...


 
{RASkov} ©   (2008-01-10 02:41) [6]

> [3] Anatoly Podgoretsky ©   (10.01.08 02:24)
> А база наверно секретом является.

Да нет некиких секретов.... я БД предложил как вариант, поэтому... если есть предложения, то я не против...


 
{RASkov} ©   (2008-01-10 02:43) [7]

> [4] Германн ©   (10.01.08 02:39)
> Его просто нужно отучить использовать фильтр в TTable, а
> взамен познакомить его с SQL. Он свой, Он поймёт.

Вот это мне нравится :)
Только боюсь, не справлюсь :(
Очень збивает с мысли мои теперешние понятия о БД, построенные в свое время методом тыка изучения БД с использованием TTable и БДЕ.....(


 
Германн ©   (2008-01-10 02:43) [8]


> {RASkov} ©   (10.01.08 02:40) [5]

Ну так учи SQL. На первый раз поможет справка по LocalSQL.


 
{RASkov} ©   (2008-01-10 02:55) [9]

> [8] Германн ©   (10.01.08 02:43)
> Ну так учи SQL.

Ну попробую еще в очередной раз :)
Пытался уже сколько раз...(

Спасибо за подсказку в сторону БД...
А без SQL (с использованием примитивных таблиц, фильтра и "супер пупер" алгоритма) - нет решения? (с надеждой легкого пути) :)
Записей в первой таблице не думаю, что будет много.... даже очень мало.... менее полтыщи....


 
Anatoly Podgoretsky ©   (2008-01-10 03:00) [10]

> {RASkov}  (10.01.2008 02:40:05)  [5]

Вот пока Козел, и есть возможность исправиться.
Сразу возьми за правило, никаких Table и никаких TAdoQuery, не придется потом себя пересиливать.
Дальше надо немного теорию посмотреть и потом конкретный диалект языка.
Простые запросы все в состоянии освоить.


 
{RASkov} ©   (2008-01-10 03:01) [11]

> [8] Германн ©   (10.01.08 02:43)

А даже с SQL"ем - как?

т.е. как в первой таблице хранить "связь" со второй.....
Я же могу одной какой-нибудь записи из первой таблици, проставить все имееющиеся характеристики из второй...
Или это в SQL"е - "не вопрос"?
А в дольнейшем отредактировать и убрать половину характеристик, например.
??


 
Германн ©   (2008-01-10 03:05) [12]


> А без SQL (с использованием примитивных таблиц

Здравствуй Парадокс!
Решение я, конечно могу подсказать.
Но я не знаю твою весовую категорию :)


 
{RASkov} ©   (2008-01-10 03:09) [13]

> [12] Германн ©   (10.01.08 03:05)
> Но я не знаю твою весовую категорию :)

?
:)


 
Юрий Зотов ©   (2008-01-10 09:48) [14]

На том же примере с книгами.

Каждая книга может относиться к нескольким жанрам одновременно. И к каждому жанру может относиться несколько книг. Значит, здесь нужна связка "многие ко многим". Обычный способ реализации такой связки - с помощью вспомогательной таблицы. В итоге имеем следующую структуру БД:

Таблица 1 (жанры):
 ID - целое (можно автоинкрементное), первичный ключ;
 Название жанра - строка, not-null, уникально;
 ... // и любые другие.

Таблица 2 (книги):
 ID -  целое (можно автоинкрементное), первичный ключ;
 Название книги - строка, not-null, уникально;
 .... // и любые другие.

Таблица 3 (реализует связь "многие ко многим"):
 ID жанра - ссылка на таблицу 1, not-null, первая часть первичного ключа;
 ID книги - ссылка на таблицу 2, not-null, вторая часть первичного ключа.

Вот и все. По желанию можно сделать каскадное удаление записей из таблицы 3 при удалении записей из таблиц 1 и 2 (а можно и не делать, а просто запретить некорректное удаление).


 
Ega23 ©   (2008-01-10 10:05) [15]


> Таблица 1 (жанры):
>  ID - целое (можно автоинкрементное), первичный ключ;
>  Название жанра - строка, not-null, уникально;
>  ... // и любые другие.
>
> Таблица 2 (книги):
>  ID -  целое (можно автоинкрементное), первичный ключ;
>  Название книги - строка, not-null, уникально;
>  .... // и любые другие.
>
> Таблица 3 (реализует связь "многие ко многим"):
>  ID жанра - ссылка на таблицу 1, not-null, первая часть
> первичного ключа;
>  ID книги - ссылка на таблицу 2, not-null, вторая часть
> первичного ключа.


Вот здесь буду спорить.
Таблица1
ID - в справочной таблице автоинкрементным делать , ИМХО, крайне нежелательно. Как минимум инкримент можно и средствами SQL организовать (что-то типа Select ID=IsNull(Max(ID)+1, 1) from Table)
Тоже самое касается и Таблицы 2 (как ни крути, она тоже справочная).

Далее, в обе справочные таблицы добавил бы поле SortOrd int not null default 0
Это для Order By SorOrd, Name.  (часто юзвери просят сделать возможность самостоятельной сортировки справочных таблиц, типа, наиболее часто встречающиеся поля - наверху выборки)

Ну и наконец Таблица 3 - не надо делать составного первичного ключа. Поставьте рядом как раз автоинкрементный счётчик, объявите его первичным ключом, а оставшиеся 2 поля - вторичные ключи к своим справочникам + если есть сильное желание, на них в паре можно уникальный индекс наложить.
Это к вопросу о суррогатных первичных ключах.


 
Юрий Зотов ©   (2008-01-10 10:14) [16]

> Ega23 ©   (10.01.08 10:05) [15]

Олег, хорошо хоть то, что против самой схемы ты не возражаешь. Которую, собственно, я и хотел показать - и лишь ее, причем как можно проще, чтобы не запудривать тонкостями мозги человеку, который в БД, по его собственным словам, пока не шарит.

А ты ему об индексах... думай, голова...


 
Ega23 ©   (2008-01-10 10:19) [17]


> хорошо хоть то, что против самой схемы ты не возражаешь


Ещё бы я на основы руку поднял...  :)


 
{RASkov} ©   (2008-01-11 03:56) [18]

> нужна связка "многие ко многим".

Спасибо всем. Значит БД и эта связка....



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
15-1198690340
Cyrax
2007-12-26 20:32
2008.02.03
JRE/JDK 6 и JRE/JDK 1.6 - одно и то же ?


11-1183049737
Nikfel
2007-06-28 20:55
2008.02.03
Как создать свой компонент.


2-1199977556
Footballer
2008-01-10 18:05
2008.02.03
IP-адрес удалённого компа


2-1199293276
Первокласник Вася
2008-01-02 20:01
2008.02.03
Как работать с дисками?


15-1198164826
No_Dead
2007-12-20 18:33
2008.02.03
А кто он Великий?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский