ВОПРОС: Можно ли иметь «ярлыки» идентификаторов в таблице, чтобы мне не приходилось делать длинную строку соединений для получения необходимой информации?
Чтобы понять, что яговоря о том, что я собираюсь выложить здесь пример, который выглядит довольно сложным, но я немного упростил проблему здесь, и это должно быть легко понято (я надеюсь).
Базовыйнастройка: «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_id
,и users
. 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.