2013-04-09 4 views
-1

У меня есть следующая проблема, связанная с сортировкой базы данных, которая была, когда я начал нечестивое сочетание Mysql, написанное вручную из заметок конверта, таблицу Excel и полностью отсутствующие записи (не спросите) Я теперь уменьшил проблему до следующего.Плохой дизайн MYSQL и как его улучшить

У меня есть 4 таблицы в значительно упрощенном виде они являются: -

customers 
--------- 
id int not null primary key, 
name varchar(50) 

users 
--------- 
id2 int not null primary key, 
name varchar(50) 

address 
------- 
id int, 
id2 int, 
country varchar(50) 

product 
------- 
id int, 
id2 int, 
item varchar(50) 

Образец данных:

Примеры выбора * от клиентов;

+----+------+ 
| id | name | 
+----+------+ 
| 1 | Fred | 
+----+------+ 

выбрать * от пользователей;

+----+---------+ 
|id2 | name | 
+----+---------+ 
| 1 | Wilma | 
| 2 | Pebbles | 
+----+---------+ 

выбрать * с адреса;

+----+-----+---------+ 
| id | id2 | country | 
+----+-----+---------+ 
| 1 | 1 | Bedrock | 
| 1 | 2 | Bedrock | 
+----+-----+---------+ 

выбрать * из продукта;

+----+-----+---------+ 
| id | id2 | item | 
+----+-----+---------+ 
| 1 | 1 | Item1 | 
| 1 | 2 | Item2 | 
+----+-----+---------+ 

customers.id является первичным ключом и ссылки на address.id и product.id

users.id2 является первичный ключ и ссылки на address.id2 и product.id2

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

В тех случаях, когда пользователи не обмениваются адресами с клиентом, я не могу работать над оператором select, который будет определять имя Клиента, адрес клиентов, имя пользователя и адрес пользователей. Эта ситуация относится к приблизительно 30% записей.

Любые предложения по сортировке этого хаоса будут наиболее желанными.

Ричард

+0

Возможно, вы упростили некоторую важную информацию. Одна из вещей, которые вы сказали, была: «Эта схема не работает, когда более одного пользователя разделяет адрес с клиентом». Если id2 является первичным ключом для пользователей, и единственный способ связать пользователей с адресом - через id2, то как несколько пользователей могут использовать один и тот же адрес? Я также не понимаю, что такое отношение между продуктами и другими таблицами - есть ли таблица отсутствующих заказов? Кроме того, можете ли вы подтвердить, является ли это учебным заданием/домашним заданием или является ли это коммерческой системой? –

+0

Пусть это станет уроком для всех нас, чтобы никогда не называть что-то 'id2'. – tadman

+0

Это сортировка записей для моего старого друга, который регулярно управляет своим бизнесом под рукой и по моему опыту в основном потерял записи. Это для бизнеса, но он, конечно, ничего не будет платить. – user2223659

ответ

0

Для того, чтобы суммировать то, что я думаю, что вы описываете: адрес может быть поделен несколькими пользователями, но пользователь/клиент может иметь только один адрес.

Похоже, что у вас есть отношения «много-к-одному» назад.

Значение у вас есть внешний ключ в таблице адресов, указывающий на клиента/пользователя, когда то, что вы действительно хотите, является внешним ключом в таблице клиента/пользователя, указывающей на адрес. Но это отвратительно ... так что пару способов вы можете его очистить:

Является клиентом также пользователем? Если это так, укажите один внешний ключ в адресе, который указывает на пользователя, а внешний ключ от пользователя к клиенту будет достаточно чистым.

Если нет, вы можете рассмотреть таблицу, которая соединяет пользователя/клиента и адрес. Что-то вроде этого:

User_Cust_ID, Type,  Address_ID 
1    Customer 5 
2    Customer 1 
1    User  1 

Это позволит вам решить проблему с пользователем и клиентом, имеющим один и тот же адрес.

HTH ...

+0

Это хуже, чем у некоторых клиентов до 5 адресов в трех разных странах. В этом отношении у меня также есть пользователь с 3 адресами. – user2223659

+0

Ну, с подходом к столику, это нормально - вы решаете много-ко-многим. Клиент может иметь несколько адресов, и адрес может принадлежать нескольким клиентам. – GojiraDeMonstah

Смежные вопросы