2013-11-20 2 views
1

у меня есть вопрос о таблицах и таблицах отношений ...
На самом деле, у меня есть эти 3 таблицыЛучший способ с отношением таблиц

CREATE TABLE USER (
    ID int(11) NOT NULL AUTO_INCREMENT, 
    NAME varchar(14) DEFAULT NULL 
); 

CREATE TABLE COUNTRY (
    ID int(11) NOT NULL AUTO_INCREMENT, 
    COUNTRY_NAME varchar(14) DEFAULT NULL 
); 

CREATE TABLE USER_COUNTRY_REL (
    ID int(11) NOT NULL AUTO_INCREMENT, 
    ID_USER int(11) NOT NULL, 
    ID_COUNTRY int(11) NOT NULL, 
); 

Итак, теперь, 1 пользователь может иметь один или более страны, поэтому несколько записей в таблице USER_COUNTRY_REL для пользователя ONE.
Но мой стол USER содержит почти 130 000 записей ...
Даже для 1 страны пользователем это почти 10Mo для таблицы USER_COUNTRY_REL.
И у меня есть несколько связанных столов в этом стиле ...

Мой вопрос в том, что это самый быстрый и лучший способ сделать?

Это не было бы лучше помещать непосредственно в поле USER, поле COUNTRY, которое содержит разные идентификаторы (например: «2, 6, ...»)?

Спасибо, ребята;)

+1

Создать индексы ... – hjpotter92

+0

Его прекрасный способ создать внешние ключи и первичные ключи, так как @ hjpotter92 написал Create Indexes. –

+0

У меня есть индексы ... Мне просто интересно, не было ли лучшего способа. И если это был правильный путь. –

ответ

1

так, как вы это является наиболее оптимальным, насколько ограничения по времени идут. Конечно, это занимает больше места, но это часть space-time tradeoff. Если вы хотите быть быстрее, вы используете больше места; если вы хотите использовать меньше места, он будет работать медленнее (в среднем).

Также подумайте о будущем. Прямо сейчас, вы, вероятно, выбираете страны для каждого пользователя, но просто ждите. Благодаря волшебству ползучести области ваше приложение в один прекрасный день должно выбрать всех пользователей в данной стране, после чего сканирование каждого поля пользователя «COUNTRY» для поиска совпадений будет невероятно медленным, в отличие от просто перехода назад через USER_COUNTRY_REL, как вы могли бы сделать сейчас.

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

+0

1-to-many не нуждается в таблице соотношений между – Volvox

+1

«[space-time tradeoff] (http://en.wikipedia.org/wiki/Space%E2%80%93time_tradeoff)» будет немного более подходящим, чем «Принцип неопределенности Гейзенберга для вычисления». :) – eggyal

+0

@eggyal aha Я знал, что для этого было официальное название :) – Klazen108

0

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

CREATE TABLE COUNTRY (
    CID int(11) NOT NULL AUTO_INCREMENT, 
    COUNTRY_NAME varchar(14) DEFAULT NULL 
); 

Then the table user: 

CREATE TABLE USER (
    ID int(11) NOT NULL AUTO_INCREMENT, 
    NAME varchar(14) DEFAULT NULL, 
    CID Foreign Key References CID inCountry 
); 

просто Создание внешнего ключа отношения между ними.

Если вы попытаетесь установить это как явное отношение, будет много данных избыточности.

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

надеюсь, что это помогает ..

Примечание: Не уверен, что точный синтаксис внешнего ключа

+0

Как это поддерживает требование иметь более одной страны для пользователя? –

+0

Его не упомянуто в требовании .. –

+0

На самом деле, у меня может быть более одной страны для пользователя ... но спасибо :) –

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