|
|
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Всем привет! При создании сайтов часто возникает задача реализации функции "добавления в избранное", когда пользователь может добавить к себе "в закладки" какую-нибудь статью, например, или товар из каталога. Т.е. такая несложная, но типовая задача, которую хотелось бы решить оптимально раз и навсегда. А вопрос у меня в том, кто как её реализует и как, на ваш взгляд, правильнее. Предлагаю свой вариант, просьба оценить. Предположим, есть сущности: - пользователь - статья - товар Я создаю сущность "Избранное", включающую в себя поля: - тип избранного (0 - для статей, 1 - для товаров, возможно 2, 3, 4, ... - для других категорий избранного) - ID-избранного (в зависимости от значения поля "тип избранного", здесь будет либо ID-статьи, либо ID-товара) - ID-пользователя (добавившего статью или товар к себе избранное) Мне в этом решении не очень нравится использования поля "тип избранного" (такое как бы "физическое" кодирование категорий избранного, не знаю как объяснить..). Либо может быть создавать ещё справочник категорий всего, что есть на сайте (включая "статьи" и "товары") и вместо поля "тип избранного" будет поле "ID-категории". В общем, жду ваших соображений) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 09:35 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefМне в этом решении не очень нравится использования поля "тип избранного" (такое как бы "физическое" кодирование категорий избранного, не знаю как объяснить..). Либо может быть создавать ещё справочник категорий всего, что есть на сайте (включая "статьи" и "товары") и вместо поля "тип избранного" будет поле "ID-категории".Справочник - это само собой. Без справочника можно обойтись разве что для битового поля, и то, если его понятно назвать :-) Не очень хорошо, что "в зависимости от значения поля "тип избранного", здесь будет либо ID-статьи, либо ID-товара" - целостность трудно поддерживать, но тут уж по разному делают - либо забивают на поддержку целостности базой, либо делают сквозные уникальные ИД, либо поддерживают триггерами, либо включением поля "тип избранного" в другие таблицы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 10:03 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
[quot alexeyvg]beefНе очень хорошо, что "в зависимости от значения поля "тип избранного", здесь будет либо ID-статьи, либо ID-товара" - целостность трудно поддерживать Вот об этом я не подумал. А какие могут быть, например, проблемы с целостностью? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 11:26 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefalexeyvgНе очень хорошо, что "в зависимости от значения поля "тип избранного", здесь будет либо ID-статьи, либо ID-товара" - целостность трудно поддерживать Вот об этом я не подумал. А какие могут быть, например, проблемы с целостностью? В смысле поменяет кто то "тип избранного", или сразу засунет в базу тип избранного 0 - для статей, ID-избранного - ID-товара) Только не надо говорить, что уж у вас-то в базе будут только правильные значения :-) Лучьше, чтобы база поддерживала целостность сама (хотя как я говорил, иногда и забивают - в конце концов, избранное не такая уж важная вещь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 11:44 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
А почему бы не завести отдельные таблички на каждый тип избранного? Это решит проблему с целостностью. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 11:57 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Можно хранить тип xml - и не парится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 12:20 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
alexeyvgbeefпропущено... Вот об этом я не подумал. А какие могут быть, например, проблемы с целостностью? В смысле поменяет кто то "тип избранного", или сразу засунет в базу тип избранного 0 - для статей, ID-избранного - ID-товара) Только не надо говорить, что уж у вас-то в базе будут только правильные значения :-) Лучьше, чтобы база поддерживала целостность сама (хотя как я говорил, иногда и забивают - в конце концов, избранное не такая уж важная вещь). Понял.. наверно я всё-таки предпочту забить в этом случае на целостность) Спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 12:49 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА почему бы не завести отдельные таблички на каждый тип избранного? Это решит проблему с целостностью. Не.. не наш метод) Вы сами то так делаете?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 12:50 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefВы сами то так делаете?) Да. Если уж разнёс сущности, то и избранные из них тоже надо разнести. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 12:55 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovbeefВы сами то так делаете?) Да. Если уж разнёс сущности, то и избранные из них тоже надо разнести. Сомневаюсь, что это правильно. Избранное - это одна бизнес-сущность. У неё есть набор атрибутов, есть выполняемые над ней действия, какая то бизнес-логика... Зачем же разносить записи этой сущности в несколько таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 13:19 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
alexeyvgИзбранное - это одна бизнес-сущность. Ничуть. Это разные сущности: "избранные статьи", "избранные товары" и т.д. У них могут быть разные наборы атрибутов и выборки по ним никогда не пересекаются. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 13:39 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovalexeyvgИзбранное - это одна бизнес-сущность. Ничуть. Это разные сущности: "избранные статьи", "избранные товары" и т.д. У них могут быть разные наборы атрибутов и выборки по ним никогда не пересекаются. Мы очевидно говорим о случае, когда это одна бизнес-сущность, т.е. пользователи рассматривают её как нечто неделимое, целостное. Описывают поведение, интерфейсы, отчёты, действия над неким объектом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 13:51 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
alexeyvgDimitry Sibiryakovпропущено... Ничуть. Это разные сущности: "избранные статьи", "избранные товары" и т.д. У них могут быть разные наборы атрибутов и выборки по ним никогда не пересекаются. Мы очевидно говорим о случае, когда это одна бизнес-сущность, т.е. пользователи рассматривают её как нечто неделимое, целостное. Описывают поведение, интерфейсы, отчёты, действия над неким объектом. Да, согласен. Я совершенно точно представляю "избранное", как одну бизнес-сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 13:58 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefЯ совершенно точно представляю "избранное", как одну бизнес-сущность. И в интерфейсе Вы представляете "избранное" пользователя как неструктурированный склад ссылок?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 14:01 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovbeefЯ совершенно точно представляю "избранное", как одну бизнес-сущность. И в интерфейсе Вы представляете "избранное" пользователя как неструктурированный склад ссылок?.. В интерфейсе же можно как угодно структурировать избранное по категориям. Здесь я проблем не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 14:08 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefЗдесь я проблем не вижу. Покажите запросы, которыми Вы будете доставать информацию для формирования интерфейса. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 14:14 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovbeefЗдесь я проблем не вижу. Покажите запросы, которыми Вы будете доставать информацию для формирования интерфейса. Например, так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Выбираю все избранные статьи (код статьи в избранном - 3) для заданного юзера (user_id = 4). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 16:10 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefВыбираю все избранные статьи Вот видите, Вы тут же рефлекторно ввели сущность "избранные статьи"... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 16:21 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovbeefВыбираю все избранные статьи Вот видите, Вы тут же рефлекторно ввели сущность "избранные статьи"... Хм) Может Вы и правы.. На самом деле, я ведь не представляю ситуации, когда придётся работать со всем избранным (статьи, товары) единообразно. То есть вряд ли придётся выбирать и обрабатывать одновременно все типы избранного. Где-то нужны только избранные статьи, а где-то - только избранные товары, но никогда - одновременно и то, и другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2011, 16:44 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНичуть. Это разные сущности: "избранные статьи", "избранные товары" и т.д. У них могут быть разные наборы атрибутов и выборки по ним никогда не пересекаются. Dimitry SibiryakovbeefВыбираю все избранные статьи Вот видите, Вы тут же рефлекторно ввели сущность "избранные статьи"... за уши притянуто. избранное - это свалка (id, смысл id, user id). какие еще "разные наборы атрибутов"? разные атрибуты в свои таблицы уже давно разложены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2011, 09:14 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
фавор такой фаворизбранное - это свалка (id, смысл id, user id). Вот и покажите, как Вы на эту свалку а) наложите FK на сущности б) выберете несколько избранных сущностей для показа в интерфейсе Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2011, 11:20 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovфавор такой фаворизбранное - это свалка (id, смысл id, user id). Вот и покажите, как Вы на эту свалку а) наложите FK на сущности б) выберете несколько избранных сущностей для показа в интерфейсе выкладывайте смысл fk, который вы зачем-то там хотите создать. чтобы нельзя было удалить запись, которую кто-то добавил себе в избранное? встречались с подобными бизнес-ограничениями? сомневаюсь что чье-то там избранное может накладывать на куда-то там ограничения. по пункту [занудо] Б) [/занудо]: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2011, 22:44 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
On 30.09.2011 10:35, beef wrote: > А вопрос у меня в том, кто как её реализует и как, на ваш взгляд, правильнее. У нас объектная БД (храним объекты), поэтому у нас проще, пользователь, --> избранные объекты. Без обобщения всех сущностей в объекты по-хорошему это и не сделать, надо делать по одной таблице избранного на каждую сущность БД, которая может быть в избранном. > Я создаю сущность "Избранное", включающую в себя поля: > - тип избранного (0 - для статей, 1 - для товаров, возможно 2, 3, 4, ... - для > других категорий избранного) > - ID-избранного (в зависимости от значения поля "тип избранного", здесь будет > либо ID-статьи, либо ID-товара) ID-избранного может быть разным в разных сущностях. В смысле, ты разные потенциально идентификаторы запихиваешь в одно поле, с одним типом данных. Это может приводить к нарушению доменной целостности данных (т.е. грубо говоря ты туда не запихнёшь какой-то идентификатор). Поэтому тебе уже придётся унифицировать типы идентификаторов всех сущностей. А тут уже до объектов один шаг. > Мне в этом решении не очень нравится использования поля "тип избранного" (такое > как бы "физическое" кодирование категорий избранного, не знаю как объяснить..). Это нормально, были бы объекты у тебя, то у тебя был бы класс объекта в таблице объектов. А тут тебе необходимо как-то отбирать записи, которые представляют ссылки на определённые сущности. Попробуй кстати написать запрос "вывести все записи из избранного", будет очень весело, тебе придётся перечислять все таблицы, которые потенциально могут быть в избранном. > Либо может быть создавать ещё справочник категорий всего, что есть на сайте > (включая "статьи" и "товары") и вместо поля "тип избранного" будет поле > "ID-категории". Ну, т.е. класс объекта. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2011, 11:04 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
Убедили, спасибо) В итоге принял решение делать отдельные сущности избранного для каждой сущности, которую можно добавить в избранное. Т.е. теперь у меня есть сущности "избранные статьи", "избранные товары" и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2011, 11:52 |
|
||
|
Реализация "избранного" в БД
|
|||
|---|---|---|---|
|
#18+
beefУбедили, спасибо) В итоге принял решение делать отдельные сущности избранного для каждой сущности, которую можно добавить в избранное. Т.е. теперь у меня есть сущности "избранные статьи", "избранные товары" и т.д. фигли, нет архитектора - можно и так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 20:59 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37464111&tid=1541997]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
147ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 467ms |

| 0 / 0 |
