2010-10-19 2 views
1

Я создаю программу виртуальных штампов для iphone и столкнулся с проблемой при реализации моей базы данных. Программа по существу имеет основную систему баллов, которые могут быть utitlized через все купец (sort've как воздушные мили), но я также хочу отслеживать, сколько раз вы были в КАЖДЫЙ коммерсантЗадача проектирования базы данных

До сих пор , я создал 3 основные таблицы для пользователей, торговцев и транзакций.

1) Таблица пользователей содержит базовую информацию, такую ​​как user_id и общее количество собранных очков.

2) Таблица торговых точек содержит информацию, такую ​​как merchant_id, местоположение, общее количество баллов.

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

Таким образом, самый простой способ разобраться, сколько раз вы были для каждого торговца, - это запрос всей таблицы транзакций как для пользователя, так и для продавца, и это даст мне историю транзакций о том, сколько раз вы Я был с этим конкретным торговцем (что идеально), но в конечном итоге я чувствую, что это будет ужасно для производительности.

Другим простым, но «тупым» методом для реализации этого было бы создание столбца в таблице users для КАЖДОГО торговца и сохранение текущих итогов. Это кажется неуместным, так как я буду добавлять новых торговцев на регулярной основе, и для каждого пользователя должны быть добавлены новые столбцы каждый раз, когда это произойдет.

Я рассмотрел отношения «один ко многим» и «многие ко многим» для баз данных mySQL, но, похоже, не может придумать что-то очень конкретное, так как я чрезвычайно новичок в web/PHP/mySQL но я предполагаю, что это то, что я ищу ...

Я также подумал о создании специальной таблицы транзакций для каждого пользователя, которая будет иметь столбец для торговца, а другой для # раз посетил. Опять же, не уверен, что это наиболее эффективная реализация.

Может кто-нибудь указать мне в правильном направлении?

+0

Foursquare & Gowalla - хорошие примеры того типа реализации, который я ищу.Любые идеи о том, как они отслеживают ваше использование у каждого торговца? – jr66

ответ

1

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

Лично я бы пошел с таблицей MerchantCounter, которая соединяется в вашей таблице Merchant с помощью id_merchant (например) и которая вы будете в курсе последних событий.

Со временем он не становится медленнее (в отличие от поиска активности) и не занимает много места.

Редактировать: основываясь на вашем комментарии, Janan, no Я бы использовал одну таблицу MerchantCounter. Таким образом, у Вас есть свой торговый стол:

id_merchant  nm_merchant 
12     Jim 
15     Tom 
17     Wilbur 

Вы бы добавить одну дополнительную таблицу, MerchantCounter (отредактирован, чтобы показать, как подсчитывать итоги для индивидуальных пользователей):

id_merchant id_user  num_visits 
12    101   3 
12    102   8 
15    101   6007 
17    102   88 
17    104   19 
17    105   1 

Вы можете увидеть, как id_merchant связывает таблицу с таблицей Merchant, а ссылки id_user - к другой таблице пользователей.

+0

Если бы у меня было, скажем, 50 торговцев, это не значит, что у меня должно быть 50 новых таблиц (по одному для каждого), которые ссылаются на основную таблицу торговцев, в дополнение к трем оригинальным. Это ты имел в виду? Кроме того, это хорошая «практика программирования»? – jr66

+0

+1 Брайан. @Janan: если производительность в конечном итоге ухудшается с более высокими томами, вы можете рассмотреть возможность архивирования и/или разбиения на разделы, а также метод денормализации, который вы упомянули. Если вы сможете установить этот фронт во время тестирования с ожидаемыми объемами, тем лучше! – richaux

+0

У меня на самом деле есть эта часть. Извините, если раньше я не объяснял свои объяснения, но изобразите этот сценарий: У меня 100 пользователей и 100 продавцов. Я хочу узнать, сколько раз пользователь 15 отправился в торговец 50. Реализация до сих пор может сказать мне, сколько раз каждый посетил купец 50, но не может сказать, сколько раз пользователь1, user2, и user3 посетили индивидуально. – jr66