Самый эффективный способ настроить таблицы MySQL? - PullRequest
2 голосов
/ 03 февраля 2011

У меня есть таблица с именем 'users', в которой есть такие поля, как

username
DOB
gender
etc

Каждый пользователь может сохранить свои растения в таблице с именем 'Plant', в которой есть следующие поля

username
plant

Таким образом, пользователь 'johndoe' будет показывать на столе 'заводы' следующим образом:

johndoe -> lilly
johndoe -> orchid1
johndoe -> orchid2
johndoe -> fern1
johndoe -> fern2

Вопросы:

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

Если я сделаю по одной таблице установки на пользователя, я думаю, что это резко увеличит количество запросов к БД и создаст огромное количество таблиц в БД.

Другойвариант будет иметь отдельные таблицы для lilly, orchid, папоротник и т. д. с такими полями, как

username

, но тогда у меня все равно будет несколько строк с повторяющимися именами пользователей.

Есть предложения?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2011

Нормализуйте свои таблицы. Добавьте поле идентификатора пользователям и сохраните этот идентификатор на заводах вместо имени пользователя.

Далее, прочитайте больше о принципах нормализации и попробуйте применить их на практике.

1 голос
/ 03 февраля 2011

Вместо использования имени пользователя я бы использовал INT ID. Вот так:

userid
username
DOB
gender
etc

и для ваших растений:

plantid
userid_fk
plantname

А затем присоединитесь к users.userid = Plant.userid_fk, чтобы найти совпадения

0 голосов
/ 03 февраля 2011

Вот как я могу это сделать на примере сценария базы данных и запроса:

Создать / загрузить таблицу пользователей - использование суррогатного первичного ключа вместо имени пользователя, поскольку запросы к INT будут выполняться быстрее и они могут измениться.

CREATE TABLE users  ( 
    id          int(11) AUTO_INCREMENT NOT NULL,
    username    varchar(255) NOT NULL,
    gender      char(1) NULL,
    PRIMARY KEY(id)
) ENGINE = MyISAM AUTO_INCREMENT = 3

Загрузка пользователей

INSERT INTO users(id, username, gender)
  VALUES(1, 'john', NULL)
GO
INSERT INTO users(id, username, gender)
  VALUES(2, 'jane', NULL)
GO

Создание растений

CREATE TABLE plants  ( 
    id      int(11) AUTO_INCREMENT NOT NULL,
    name    varchar(200) NOT NULL,
    PRIMARY KEY(id)
) ENGINE = MyISAM AUTO_INCREMENT = 6

Грузовые установки

INSERT INTO plants(id, name)
  VALUES(1, 'fern1')
GO
INSERT INTO plants(id, name)
  VALUES(2, 'fern2')
GO
INSERT INTO plants(id, name)
  VALUES(3, 'orchid1')
GO
INSERT INTO plants(id, name)
  VALUES(4, 'orchid2')
GO
INSERT INTO plants(id, name)
  VALUES(5, 'lilly1')

Создать таблицу соединения Я использую здесь суррогатный первичный ключ, так как многие веб-платформы не будут корректно обновлять таблицу соединения с первичным столбцом из 2 столбцов. Кроме того, я заканчивал тем, что довольно часто добавлял метаданные / детали к этим типам объединений, и без этого становится грязно. Примечание. Я не ограничиваю комбинацию одного и того же пользователя, добавляя тот же тип установки, но вы можете легко.

CREATE TABLE plants_users  ( 
    id          int(11) AUTO_INCREMENT NOT NULL,
    plant_id    int(11) NOT NULL,
    user_id     int(11) NOT NULL,
    PRIMARY KEY(id)
)
ENGINE = MyISAM
AUTO_INCREMENT = 8
GO
CREATE INDEX fk_plant_id USING BTREE 
    ON plants_users(plant_id)
GO
CREATE INDEX fk_user_id USING BTREE 
    ON plants_users(user_id)

Загрузить таблицу соединений

INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(1, 1, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(2, 2, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(3, 3, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(4, 4, 1)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(5, 2, 2)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(6, 3, 2)
GO
INSERT INTO plants_users(id, plant_id, user_id)
  VALUES(7, 5, 2)

Окончательный запрос:

select
    users.username,
    plants.name
from
    users,plants,plants_users
where
    users.id = plants_users.user_id and
    plants.id = plants_users.plant_id

Результат:

    user    name
    john    fern1
    john    fern2
    john    orchid1
    john    orchid2
    jane    fern2
    jane    orchid1
    jane    lilly1
0 голосов
/ 03 февраля 2011

Это вполне разумный способ (ваше первоначальное предложение) настроить вещи;это то, для чего реляционные базы данных .

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

Для повышения эффективности вы можете использовать id для обозначения ваших пользователей вместо имени пользователя.В большинстве реляционных баз данных id является номером строки и является очень эффективной (и компактной) ссылкой.

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