SQL-идентификаторы «ярлыков» или длинная строка соединений? - PullRequest
1 голос
/ 07 августа 2011

ВОПРОС: Можно ли иметь «ярлыки» идентификаторов в таблице, чтобы мне не приходилось делать длинную строку соединений для получения необходимой информации?

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

Базовыйнастройка: «company» может быть «affiliate», «client» или обоими.Каждая «компания» может иметь несколько «contacts», некоторые из которых могут быть «users» с правами входа в систему.

`Company` table
----------------------------------------------
ID  Company_Name             Address
--  -----------------------  -----------------
 1  Acme, Inc.               101 Sierra Vista
 2  Spacely Space Sprockets  East Mars Colony
 3  Cogswell Cogs            West Mars Colony
 4  Stark Industries         Los Angeles, CA

МыВ нашей базе данных есть четыре компании.

`Affiliates` table
---------------------
ID  Company_ID  Price  Sales
--  ----------  -----  -----
 1           1     50    456
 2           4     50    222
 3           1     75     14

Каждая компания может иметь несколько идентификаторов партнеров, чтобы они могли представлять продукты на разных уровнях цен на разных рынках.

Две наши компании являются филиалами(Acme, Inc. и Stark Industries), и Acme имеет два идентификатора филиала

`Clients` table
--------------------------------------
ID  Company_ID  Referring_affiliate_id
--  ----------  ----------------------
 1           2                       1
 2           3                       1
 3           4                       3

. Каждая компания может быть клиентом только один раз.

Три наших компании являются клиентами (Spacely Space Sprockets, Cogswell Cogs и Stark Industries, которая также является аффилированным лицом)
Во всех трех случаях они были переданы нам компанией Acme, Inc., используя один из двух своих аффилированных ID

`Contacts` table
-----------------------------------------
ID  Name            Email
--  --------------  ---------------------
 1  Wylie Coyote    wcoyote@acme.com
 2  Cosmo Spacely   boss@spacely.com
 3  H. G. Cogswell  ceo@cogs.com
 4  Tony Stark      tony@stark.com
 5  Homer Simpson   simpson@burnscorp.com

каждыйУ компании есть хотя бы один контакт, но в этой таблице нет указания, на какую компанию работает каждый контакт, а также есть дополнительный контакт (# 5).Мы вернемся к этому через мгновение.
Каждый из этих контактов может иметь или не иметь учетную запись в системе.

`Contacts_type` table
--------------------------------------
contact_id  company_id  contact_type
----------  ----------  --------------
         1           1  Administrative
         2           2  Administrative
         3           3  Administrative
         4           4  Administrative
         5           1  Technical
         4           2  Technical

Связывает контакт с одной или несколькими компаниями.
Каждый контакт связан с компанией, и, кроме того, контакт 5 (Гомер Симпсон) является техническим контактом для Acme, Inc, а контакт 4 (Тони Старк) является административным контактом для компании 4 (Stark Industries) и техническимконтакт для компании 3 (Cogswell Cogs)

`Users` table
-------------------------------------------------------------------------------------
ID  contact_id  company_id  client_id  affiliate_id  user_id   password  access_level
--  ----------  ----------  ---------  ------------  --------  --------  ------------
 1           1           1          1             1  wylie     A03BA951             2
 2           2           2          2          NULL  cosmo     BF16DA77             3
 3           3           3          3          NULL  cogswell  39F56ACD             3
 4           4           4          4             2  ironman   DFA9301A             2

Таблица пользователей - это, по сути, список контактов, которым разрешено входить в систему.
Ноль или один пользователь на контакт;один контакт на пользователя.

Контакт 1 (Wylie Coyote) работает на компанию 1 (Acme) и является клиентом (1), а также партнером (1)
Контакт 2 (Cosmo Spacely) работает на компанию2 (Spacely Space Sprockets) и является клиентом (2), но не партнером
и т. Д. *

СЕЙЧАС, наконец, на проблему, если есть один ...

DoУ меня есть круговая ссылка через столбцы client_id и affiliate_id в таблице Users?Это плохо?Мне трудно обдумать это.

Когда кто-то входит в систему, он проверяет свои учетные данные в таблице пользователей и использует users. contact_id, users. client_idusers. affiliate_id для быстрого поиска, вместо того, чтобы объединять строки таблиц, чтобы найти одну и ту же информацию.Но это приводит к дублированию данных.

Без client_id в таблице users я должен был бы найти следующую информацию следующим образом:

affiliate_id:    join `users`.`contact_id` to `contacts_types`.`company_id` to `affiliates`.`company_id`
client_id:       join `users`.`contact_id` to `contacts_types`.`company_id` to `clients`.`company_id`
company_id:      join `users`.`contact_id` to `contacts_types`.`company_id` to `company`.`company_id`
user's name:     join `users`.`contact_id` to `contacts_types`.`contact_id` to `contacts`.`contact_id` > `name`

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

Это лучше?выполнять такие виды объединений и проходить через несколько таблиц, чтобы получить нужную мне информацию, или лучше иметь поле «ярлык», чтобы получить нужную мне информацию?

У меня такое чувство, что по всемв некотором роде это слишком сложно, но я не понимаю, как.

Я использую MySQL.

1 Ответ

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

лучше делать соединения. вы должны денормализовать свои данные только тогда, когда у вас есть своевременные доказательства медленного ответа.

Сказав это, есть несколько способов уменьшить количество набираемого текста:

  1. используйте "как", чтобы дать более короткие имена вашим полям
  2. создание просмотров. это «виртуальные таблицы», в которые уже встроены стандартные объединения, так что вам не придется повторять каждый раз.
  3. используйте "с" в sql. это позволяет вам определять что-то вроде представления в пределах одного запроса.

возможно, MySQL не поддерживает все вышеперечисленное - вам нужно проверить документы [обновление: хорошо, недавний MySQL, похоже, поддерживает представления, но не «с». так что вы можете добавлять представления, чтобы выполнять работу affiliate_id, client_id и т. д. и обрабатывать их как таблицы в ваших запросах, но при этом сохраняя правильную организацию базовых данных.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...