2015-01-18 2 views
-1

Мне интересно, какую потенциальную проблему я могу получить. Моя проблема, скажем, у меня есть две таблицы, одна из которых называется ораторы и клиентов. В клиентской таблице клиент имеет идентификаторы громкоговорителей 1,5,8 (SAVED в поле STRING) - , поэтому я использую explode() для получения значений.Производительность базы данных от php-звонков

Итак, теперь я должен вызвать таблицу динамиков 3 раза, чтобы получить значения каждого динамика. Это вводит проблему, что она станет очень дорогой, если есть много пользователей в Интернете, не так ли?

Есть ли альтернатива вызову таблицы из массива элементов или чего-то еще?

Я не слишком разбираюсь во всех подходах к php, поэтому любая помощь будет оценена!

+5

Вам нужно посмотреть некоторые учебные пособия по реляционной базе данных. Ваш дизайн ужасен. Просто google 'реляционная конструкция базы данных' и выберите несколько. – RiggsFolly

ответ

1

Основываясь на описании вашей базы данных, каждый клиент может иметь несколько динамиков. Это отношение «один ко многим» (1-N) и обычно выражается в двух таблицах. Один из них - это главный стол, «клиенты», который хранит информацию о клиенте, но ничего не говорит о динамиках. Подчиненная таблица, «колонки», хранит информацию о каждом динамике и идентификаторе клиента, с которым он связан.

Например, динамик 1, динамик 5 и динамик 8 имеют одинаковый идентификатор клиента в таблице колонок. Поле client_id в таблице колонок называется внешним ключом.

Теперь вы можете получить всю информацию о динамиках для клиента 1 в одном запросе:

select * from clients, speakers where clients.clientid=speakers.clientid and clients.clientid=1 

Ваш текущий дизайн два стола испорчен, потому что у вас есть столбец speakeridS в таблице клиентов. Столбец внешнего ключа, который выражает ONE в соотношении 1-N, всегда должен находиться в «много» таблице, то есть «динамиках».

Поскольку ваша текущая таблица громкоговорителей не имеет информации client_id, вам нужно будет написать преобразователь данных, чтобы перенести строку, поля с разделителями-запятыми в таблицу клиентов, в числовое поле внешнего ключа «clientid» в стол для колонок. Это одноразовое преобразование так что вы можете сделать это в PHP скрипт:

$query="select * from clients"; 
$rs=mysql_query($query,$db); 
while ($myrow=mysql_fetch_array($rs)){ 
    $clientid=$myrow['clientid']; 
    $speakerids=explode(',',$myrow['speakers']); 
    foreach ($speakerids as $speakerid){ 
    if (!is_numeric($speakerid)) continue; 
    $query="update speakers set clientid=$clientid where speakerid=$speakerid"; 
    mysql_query($query,$db); 
    } 
} 

Ваше приложение отображает колонки в контрольном списке. Интерфейс, однако, не должен диктовать вашу структуру хранения. Напишите цикл и сохраните идентификатор клиента в каждой записи колонок.

Если один и тот же динамик работает с несколькими клиентами, вам понадобится таблица «много ко многим» (N-N). Это делается через таблицу мостов. В этом случае ни клиенты, ни колонки не должны знать друг о друге. Создайте еще одну таблицу под названием «клиенты-клиенты», которая включает по меньшей мере два внешних ключа: clientid и speakerid.

+0

Да, exaccty - вы объяснили это намного лучше, чем я мог опубликовать его изначально! За исключением того, что таблица колонок не имеет идентификатора от клиента, хранящегося в нем. Стол динамиков находится там, где можно извлечь информацию. Я храню идентификаторы динамиков в таблице клиентов (через флажки), чтобы иметь возможность просматривать динамики, выбранные клиентом. – Muppet

+0

Хорошо, позвольте мне расширить свой ответ для решения новой проблемы, а именно, таблица колонок не имеет данных client_id. – Schien

+0

Большое спасибо за обновленный ответ Schien! Def нужно смотреть более подробно на эту тему. – Muppet

2

Я согласен с @RiggsFolly, что это не может быть лучшим способом для хранения данных, вы могли бы сделать что-то вроде этого:

SELECT (whatever fields you want or speakers.* for all) FROM speakers JOIN clients ON clients.id=(clients.id) WHERE speakers.id IN (clients.field_with_speakers_list_string); 

Я считаю, что поможет вам идти. Он должен вернуть то, что вы хотите. Вам просто нужно будет заменить (clients.id) идентификатором клиента, который у вас уже есть в вашем скрипте, и сменить speaker.id на любое поле идентификатора в таблице ваших колонок и изменить поле_имя_спиков_list_string на любое поле в таблице ваших клиентов со строкой динамиков, и, конечно, изменить часть SELECT на поля, которые вы хотите ограничить.

+0

Спасибо, посмотрим! – Muppet

+1

Нет проблем. Надеюсь, что это работает! Если нет, не стесняйтесь ударить меня, и мы сможем работать над этим. – ijustin

+0

делает это утверждение - IN (clients.field_with_speakers_list_string) в конце пробегает эту строку для вас? – Muppet

Смежные вопросы