Условные отношения SQL - PullRequest
       11

Условные отношения SQL

2 голосов
/ 04 августа 2011

Я предложил два подхода к одной и той же идее и хотел бы избежать каких-либо очевидных ловушек, используя один над другим.У меня есть таблица (tbl_post), где одна строка может иметь много связей с другими таблицами (tbl_category, tbl_site, tbl_team).У меня есть таблица отношений, чтобы присоединиться к ним, но я не знаю, какую структуру использовать, условную или прямую?Надеюсь, что следующее объяснит ...

tbl_post (simple post, can be associated with many categories, teams and sites)
* id
* title
* content

tbl_category
* id
* title
* other category only columns

tbl_team
* id
* title
* other team only columns

tbl_site
* id
* title
* other site only columns

----------------------------------------------------------
tbl_post_relationship
* id (pk)
* post_id (fk tbl_post)
* related_id (fk, dependant on related_type to either tbl_category, tbl_site or tbl_team)
* related_type (category, site or team)

____________________________________
|id|post_id|related_id|related_type|
|--|-------|----------|------------|
| 1|      1|         6|    category|
| 2|      1|         4|        site|
| 3|      1|         9|    category|
| 4|      1|         3|        team|
------------------------------------

SELECT  c.*
FROM    tbl_category c
        JOIN tbl_relationship r ON
            r.post_id = 1
            AND r.related_type = 'category'
            AND c.id = r.related_id

------------- OR ---------------

tbl_post_relationship
* id (pk)
* post_id (fk tbl_post)
* category_id (fk tbl_category)
* site_id (fk tbl_site)
* team_id (fk tbl_team)

________________________________________
|id|post_id|category_id|site_id|team_id|
|--|-------|-----------|-------|-------|
| 1|      1|          6|   NULL|   NULL|
| 2|      1|       NULL|      4|   NULL|
| 3|      1|          9|   NULL|   NULL|
| 4|      1|       NULL|   NULL|      3|
----------------------------------------

SELECT  c.*
FROM    tbl_category c
        JOIN tbl_relationship r ON
            r.post_id = 1
            AND r.category_id = c.id

Итак, при одном подходе я получу множество столбцов (может быть, больше таблиц) с NULL.Или я получаю одну простую таблицу для ее обслуживания, но каждое соединение основано на «типе».Я также знаю, что у меня может быть таблица для каждого отношения, но опять же кажется, что слишком много таблиц.Есть идеи / мысли?

1 Ответ

5 голосов
/ 04 августа 2011

Вы лучше всего с одной таблицей на отношения.Вы не должны беспокоиться о количестве столов.Недостатки одной таблицы отношений - несколько, и это довольно рискованно:

1) Вы не можете применять внешние ключи, если связанные таблицы меняются от строки к строке, поэтому ваша целостность данных находится под угрозой ... и раньше, илипозже у вас будут потерянные данные.

2) Запросы являются более сложными, потому что вы должны использовать related_type для фильтрации отношений во многих местах.

3) Обслуживание запросов обходится дороже, дляпо тем же причинам, что и в 2), а также потому, что вы должны явно использовать константы related_type во многих местах ... это будет ад, когда вам нужно их изменить или добавить.

Я бы посоветовал вам использоватьортодоксальный дизайн ... только что получил 3 различных таблицы отношений: post_category, post_team, post_site.

...