|
|
|
| Прошу совета.
Таблицы:
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. И вот здесь с организацией таблиц я никак не могу придумать ничего путного. | |
|
|
|
|
|
|
|
для: Hvost
(16.07.2009 в 01:14)
| | >задача: исправить неверное написание и определить группу, если она не определена (0)
написание чего?
И где критерии написания верного? | |
|
|
|
|
|
|
|
для: 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 группы часть правил. | |
|
|
|
|
|
|
|
для: Hvost
(16.07.2009 в 02:48)
| | вот ведь...
По-моему, ( и насколько мне известно, SQL со мной в этом согласен) тескт состоит не из значений, а из символов. И чтобы перейти от потока символов к потоку значений, сперва потребуется выполнить лексический анализ. А Вы о нем ну просто ни слова.
Не говоря о том, что возможности MySQL по этой части мало того, что довольно скромны,.так еще и весьма криво вписываются в логику SELECT запросов в принципе. | |
|
|
|
|
|
|
|
для: 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 в 10:32)
| | Я рассуждаю так:
Для решения этой задачи нужно:
1. Создать таблицу с именами, где у каждого имени будет свой уникальный идентификатор, вне зависимости от "одинаковости" символьного представления имени и номер группы.
2. Создать таблицу с аллиасами, где у каждого аллиаса будет указана ссылка (id) на основное имя и номер группы. Основные имена дописываем в таблицу аллиасов, как аллиасы, для того, чтобы при поиске обращаться к одной таблице, а не к двум, по этой же причине пишем и номер группы к каждому аллиасу. Т.к. мы знаем, что имена могут пересекаться в разных группах и набор аллиасов для одинаковых имен тоже одинаков, то...
- можно к каждому аллиасу дописывать список id основных имен и список номеров групп
(в этом случае больше телодвижений при формировании массива для поиска)
-можно в таблицу аллиасов дописывать одинаковые аллиасы для одинаковых имен в разных группах
(в этом случае лишние запросы при добавлении нового аллиаса, такие как: узнать, это имя уникально или уже существует, если уже существует, то выбрать все существующие аллиасы и т.д. А также повторяющиеся аллиасы в таблице)
-можно создать таблицу аллиасов, вида: аллиас -> имя и промежуточную таблицу, вида: имя -> список id имен, список id групп (недостатков еще больше, чем у предыдущих двух вариантов)
Наверняка есть решение, которое я не вижу. Поэтому и прошу совета. | |
|
|
|
|