Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Организация БД
 
 автор: Hvost   (16.07.2009 в 01:14)   письмо автору
 
 

Прошу совета.

Таблицы:

CREATE TABLE `a_groups` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(100),
  `groups` int(11),
  PRIMARY KEY  (`id`),
  KEY `name` (`name`),
  KEY `groups` (`groups`)
);

INSERT INTO `a_groups` (`id`, `name` , `groups` ) 
VALUES 
(1, 'Александр', 1), 
(2, 'Руслан', 1), 
(3, 'Игорь', 2), 
(4, 'Михаил', 2), 
(5, 'Наталья', 3),
(6, 'Борис', 3);

CREATE TABLE `rull_groups` (
  `id` int(11) NOT NULL auto_increment,
  `rulles` char(100),
  `id_name` int(11),
  `id_groups` int(11),
  PRIMARY KEY  (`id`),
  UNIQUE KEY `rulles` (`rulles`),
  KEY `id_name` (`id_name`),
  KEY `id_groups` (`id_groups`)
);

INSERT INTO `rull_groups` (`rulles`, `id_name` , `id_groups`) 
VALUES 
('Александр', 1, 1), 
('Руслан', 2, 1), 
('Игорь', 3, 2), 
('Михаил', 4, 2), 
('Наталья', 5, 3), 
('Борис', 6, 3)
('Аликсандр', 1, 1), 
('Мехаил', 4, 2);


и есть текст:
номер строки|текст|id группы
1|текст текст текст текст текст Александр текст текст текст текст|1
2|текст текст текст Аликсандр текст текст текст|1
3|текст текст текст текст текст текст текст текст Михаил текст|0
4|текст текст Мехаил текст текст текст текст текст|2
5|текст текст текст Аликсандр текст текст текст|0

задача: исправить неверное написание и определить группу, если она не определена (0)

решение простое:
собираем из таблицы rull_groups ассоциативный массив массивов, вида:
$arr_search[$id_groups]=array($rulles => $id_name);
строки с известным id группы прогоняем только по правилам соответствующей группы функцией strpos() и возвращаем id_name,
строки с неизвестным id группы прогоняем по всем правилам этой же функцией и возвращаем id_name и id_groups

проблема:
если в таблицу a_groups добавить запись:

INSERT INTO `a_groups` (`id`, `name` , `groups` ) 
VALUES (7, 'Александр', 3);

то у нас name Александр будет не только в группе 1, но и в группе 3. И вот здесь с организацией таблиц я никак не могу придумать ничего путного.

  Ответить  
 
 автор: Trianon   (16.07.2009 в 01:45)   письмо автору
 
   для: Hvost   (16.07.2009 в 01:14)
 

>задача: исправить неверное написание и определить группу, если она не определена (0)

написание чего?
И где критерии написания верного?

  Ответить  
 
 автор: Hvost   (16.07.2009 в 02:48)   письмо автору
 
   для: Trianon   (16.07.2009 в 01:45)
 

>написание чего?
значений поля `name` таблицы `a_groups`

>И где критерии написания верного?
`a_groups`.`name` - верно
`rull_groups`.`rulles` - возможные значения(ошибки)

связь:
SELECT `a_groups`.`name` AS pravilno, `rull_groups`.`rulles` AS nepravilno
FROM `rull_groups`
LEFT JOIN `a_groups` ON `rull_groups`.`id_name`=`a_groups`.`id`


т.е. нужно найти в тексте возможные (и неправильные) значения (`rull_groups`.`rulles`) и по этому значению (или другим, не пришедшим мне в голову способом) получить идентификатор строки с правильным значением (`a_groups`.`id`) и группу(-ы) к этому значению (`a_groups`.`groups`)

`rull_groups`.`id_groups` нужно для того, чтобы не гонять весь массив правил (`rull_groups`.`rulles`) по строкам с заранее известным id группы, а использовать только соответсвующую id группы часть правил.

  Ответить  
 
 автор: Trianon   (16.07.2009 в 02:59)   письмо автору
 
   для: Hvost   (16.07.2009 в 02:48)
 

вот ведь...
По-моему, ( и насколько мне известно, SQL со мной в этом согласен) тескт состоит не из значений, а из символов. И чтобы перейти от потока символов к потоку значений, сперва потребуется выполнить лексический анализ. А Вы о нем ну просто ни слова.
Не говоря о том, что возможности MySQL по этой части мало того, что довольно скромны,.так еще и весьма криво вписываются в логику SELECT запросов в принципе.

  Ответить  
 
 автор: Hvost   (16.07.2009 в 10:32)   письмо автору
 
   для: Trianon   (16.07.2009 в 02:59)
 

>тескт состоит не из значений, а из символов
совершенно верно, а поле `name` состоит из значений, т.е. ряда символов.
В этом и заключается (для меня) основная проблема. Т.к. символьное значение поля name одинаково для строк `a_groups`.`id`=1 и `a_groups`.`id`=7 (а субъекты разные).

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

Если все-таки вернуться к вопросу, то кривые, хотя и возвращающие правильный результат, варианты решения доступны. И кривизна заключается в не совсем оптимальном хранении данных.

Например, можно в таблицу `rull_groups`, в случае повторений значений `a_groups`.`name` добавлять в `id_name` и `id_groups` не один id, а список(поменяв при этом тип поля) или добавлять строки, где вся строка будет уникальной, а поле `rulles` нет.

Но хотелось бы более корректных предложений.

И да, если отбросить все мои эксперименты, то задачу можно поставить так:

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

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

Как организовать поиск по тексту - не вопрос. Вопрос в правильной организации БД для осуществления подобного поиска.

  Ответить  
 
 автор: Hvost   (16.07.2009 в 11:00)   письмо автору
 
   для: Hvost   (16.07.2009 в 10:32)
 

Я рассуждаю так:
Для решения этой задачи нужно:
1. Создать таблицу с именами, где у каждого имени будет свой уникальный идентификатор, вне зависимости от "одинаковости" символьного представления имени и номер группы.
2. Создать таблицу с аллиасами, где у каждого аллиаса будет указана ссылка (id) на основное имя и номер группы. Основные имена дописываем в таблицу аллиасов, как аллиасы, для того, чтобы при поиске обращаться к одной таблице, а не к двум, по этой же причине пишем и номер группы к каждому аллиасу. Т.к. мы знаем, что имена могут пересекаться в разных группах и набор аллиасов для одинаковых имен тоже одинаков, то...
- можно к каждому аллиасу дописывать список id основных имен и список номеров групп
(в этом случае больше телодвижений при формировании массива для поиска)
-можно в таблицу аллиасов дописывать одинаковые аллиасы для одинаковых имен в разных группах
(в этом случае лишние запросы при добавлении нового аллиаса, такие как: узнать, это имя уникально или уже существует, если уже существует, то выбрать все существующие аллиасы и т.д. А также повторяющиеся аллиасы в таблице)
-можно создать таблицу аллиасов, вида: аллиас -> имя и промежуточную таблицу, вида: имя -> список id имен, список id групп (недостатков еще больше, чем у предыдущих двух вариантов)

Наверняка есть решение, которое я не вижу. Поэтому и прошу совета.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования