Простой вопрос базы данных MySQL - PullRequest
0 голосов
/ 20 апреля 2009

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

Как бы я спроектировал базу данных MySQL, если бы у меня были следующие поля:

ID, лат, долго, дата - несколько дат, время - несколько раз

Я знаю, я должен положить это в две таблицы, верно? И как будут выглядеть эти две таблицы?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 20 апреля 2009

Ваша первая таблица может называться «location», и в качестве первичного ключа она будет иметь столбец «id», а также два столбца «широта» и «долгота» (которые могут быть varchar или числовым типом, в зависимости от того, что ваше приложение требует). Ваша вторая таблица может называться «location_event», и в качестве первичного ключа она может иметь столбец «id», а также столбец внешнего ключа «location_id», который является ссылкой на первичный ключ таблицы «location». Эта таблица "location_event" также будет иметь столбец "date" и столбец "time" (с типом date и time соответственно).

3 голосов
/ 20 апреля 2009

Трудно сказать, что вы пытаетесь сделать из краткого описания, но третья нормальная форма диктует, что любой столбец должен зависеть от:

  • ключ.
  • весь ключ.
  • ничего, кроме ключа.

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

Location
    LocId primary key
    Lat
    Long
Events
    LocId foreign key Location(LocId)
    Date
    Time

Это основано на моем (возможно, некорректном) анализе того, что вы хотите сохранить местоположение, в котором может произойти ноль или более событий.

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

1 голос
/ 20 апреля 2009

Насколько я могу догадаться, дата и время пары всегда появляются вместе. В этом случае я бы предложил две таблицы: местоположение и время.

CREATE TABLE location (
  id INT  NOT NULL,
  lat FLOAT  NOT NULL,
  long FLOAT  NOT NULL,
  PRIMARY KEY (id)
)


CREATE TABLE time (
  id INT  NOT NULL,
  locationid INT  NOT NULL,
  date DATE  NOT NULL,
  time DATE  NOT NULL
)

При желании вы можете добавить ограничение внешнего ключа

ALTER TABLE time ADD CONSTRAINT location_fk_constraint FOREIGN KEY location_fk_constraint (locationid)
    REFERENCES location (id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;
0 голосов
/ 20 апреля 2009

Хорошо, скажем, ради аргумента, что вы говорите о долготе и широте. Что это записи в каком-то списке (возможно, морской журнал? Arrgh, me maties! ) долготы и широты. И что каждая из этих длинных / длинных пар может появляться в списке более одного раза.

Возможно, вы хотите создать базу данных, которая будет определять, сколько появлений у каждой пары long / lat и когда произошло каждое появление?

Итак, как это: сначала у нас есть таблица пар long / lat, и мы дадим каждому из них идентификатор.

ID  long   lat
--  -----  -----
1   11111  22222
2   33333  44444
3   55555  66666

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

ID  date     time
--  ----     -----
1   1/1/1900 12:30
1   2/2/1900 12:31
1   3/2/1900 12:30
2   1/1/1930 08:21

Допустим, вы назовете первую таблицу "longlat", а вторую "appearances".

Вы можете найти все появления одной пары long / lat, выполнив что-то вроде:

SELECT date,time FROM appearances 
   LEFT JOIN longlat ON appearances.ID=longlat.ID 
   WHERE longlat.long = 11111 AND longlat.lat = 22222

Вы можете посчитать, сколько раз что-то происходило на долготе 11111, выполнив:

SELECT count(ID) FROM appearances 
   LEFT JOIN longlat ON appearances.ID=longlat.ID 
   WHERE longlat.long = 11111

Надеюсь, это поможет! Должен признать, что довольно сложно раздражать, пытаясь угадать, что люди имеют в виду ... Постарайтесь прояснить себя в будущем, и вы увидите, что полученная вами помощь будет гораздо более полезной, лаконичной и ориентированной что тебе нужно.

Удачи!

...