Реляционные базы данных MySQL с большим набором данных?

Я пытаюсь получить доступ к данным из двух таблиц, которые имеют общее поле «SpeciesName».

Таблица «координаты» — это очень большой набор данных с более чем 5500 записями, а сама таблица содержит около 26 полей. Уникальным идентификатором этой таблицы является номер матрицы, который находится в диапазоне от 0 до 5500, и каждая строка содержит немного уникальные данные. Однако есть несколько строк с одним и тем же «SpeciesName» - в таблице всего 446 уникальных «SpeciesNames».

В таблице «common» хранятся общие данные имени и изображения для каждого «SpeciesNames» с 3 полями. В основном то, что я пытаюсь сделать, это установить отношение MySQL между двумя таблицами, используя «SpeciesNames» в качестве внешнего ключа, и получить доступ к данным из обоих в одном запросе.

Когда начать? Поиски в Google дали результаты, касающиеся таблиц, содержащих одно или два поля. Однако, когда я запрашиваю, я хочу выбрать ВСЕ поля из ОБЕИХ таблиц в PHP. Любой совет по этому поводу был бы замечательным.

Изменить: я знаю, что на данный момент данных немного, но они будут! Я должен был быть более ясным об этом. Это «координаты»:

`Authors` varchar(500) DEFAULT NULL,
  `Journal` varchar(500) DEFAULT NULL,
  `YearPublication` varchar(500) DEFAULT NULL,
  `DOIISBN` varchar(500) DEFAULT NULL,
  `AdditionalSource` varchar(500) DEFAULT NULL,
  `Ecoregion` varchar(500) DEFAULT NULL,
  `GrowthType` varchar(500) DEFAULT NULL,
  `GrowthFormRaunkiaer` varchar(500) DEFAULT NULL,
  `NumberPopulations` varchar(500) DEFAULT NULL,
  `AnnualPeriodicity` varchar(500) DEFAULT NULL,
  `CriteriaSize` varchar(500) DEFAULT NULL,
  `CriteriaOntogeny` varchar(500) DEFAULT NULL,
  `CriteriaAge` varchar(500) DEFAULT NULL,
  `Kingdom` varchar(500) DEFAULT NULL,
  `Phylum` varchar(500) DEFAULT NULL,
  `AngioGymno` varchar(500) DEFAULT NULL,
  `DicotMonoc` varchar(500) DEFAULT NULL,
  `Class` varchar(500) DEFAULT NULL,
  `_Order` varchar(500) DEFAULT NULL,
  `Family` varchar(500) DEFAULT NULL,
  `Genus` varchar(500) DEFAULT NULL,
  `SpeciesName` varchar(500) DEFAULT 'NA',
  `EnteredBy` varchar(500) DEFAULT NULL,
  `EnteredDate` varchar(500) DEFAULT NULL,
  `Source` varchar(500) DEFAULT NULL,
  `SpeciesAuthor` varchar(500) DEFAULT NULL,
  `StudiedSex` varchar(500) DEFAULT NULL,
  `MatrixComposite` varchar(500) DEFAULT NULL,
  `MatrixTreatment` varchar(500) DEFAULT NULL,
  `MatrixCaptivity` varchar(500) DEFAULT NULL,
  `MatrixStartYear` varchar(500) DEFAULT NULL,
  `MatrixStartSeason` varchar(500) DEFAULT NULL,
  `MatrixStartMonth` varchar(500) DEFAULT NULL,
  `MatrixEndYear` varchar(500) DEFAULT NULL,
  `MatrixEndSeason` varchar(500) DEFAULT NULL,
  `MatrixEndMonth` varchar(500) DEFAULT NULL,
  `Population` varchar(500) DEFAULT NULL,
  `LatDeg` varchar(500) DEFAULT NULL,
  `LatMin` varchar(500) DEFAULT NULL,
  `LatSec` varchar(500) DEFAULT NULL,
  `LonDeg` varchar(500) DEFAULT NULL,
  `LonMin` varchar(500) DEFAULT NULL,
  `LonSec` varchar(500) DEFAULT NULL,
  `LatitudeDec` varchar(500) DEFAULT NULL,
  `LongitudeDec` varchar(500) DEFAULT NULL,
  `Altitude` varchar(500) DEFAULT NULL,
  `Country` varchar(500) DEFAULT NULL,
  `Continent` varchar(500) DEFAULT NULL,
  `MatrixSplit` varchar(500) DEFAULT NULL,
  `Observation` varchar(500) DEFAULT NULL,
  `MatrixClassOrganized` varchar(500) DEFAULT NULL,
  `Matrixnumber` varchar(500) NOT NULL DEFAULT '',
  `MatrixClassNumber` varchar(500) DEFAULT NULL,
  `Dimension` varchar(500) DEFAULT NULL,
  `plantType` varchar(500) DEFAULT NULL,
  `matrix` varchar(15000) DEFAULT NULL,
  `_ClassNames` varchar(16000) DEFAULT NULL,
  `StatusStudy` varchar(500) DEFAULT NULL,
  `StatusStudyRef` varchar(500) DEFAULT NULL,
  `StatusElsewhere` varchar(500) DEFAULT NULL,
  `StatusElsewhereRef` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`Matrixnumber`),

И «общее»:

  `ID` varchar(100) NOT NULL,
  `CommonName` varchar(100) NOT NULL,
  `ImageUrl` varchar(200) NOT NULL,
  `UploadImgUrl` varchar(100) NOT NULL,
  UNIQUE KEY `SpeciesAccepted` (`ID`),
  KEY `ID` (`ID`)

Я в основном наношу каждую запись на карту, используя координаты и отображаю всю информацию из «координатов» - это уже было успешно достигнуто. Таблица «common» содержит новую информацию, которая была динамически создана для каждого «SpeciesName» (coords.SpeciesName и common.ID), поэтому я хотел бы отобразить CommonName и использовать «ImageUrl» и «UploadedImgUrl» вместе с данными, которые я ранее имел. Я все еще немного новичок в MySQL, поэтому прошу прощения, если моя терминология не идеальна!


person user3015175    schedule 13.10.2014    source источник
comment
5500 записей это не много. Ваша проблема/ситуация мне не совсем ясна, но я думаю, вам нужны отношения «многие ко многим».   -  person Peter    schedule 13.10.2014
comment
поверьте мне, 5500 - это очень маленький размер для mysql :) например, таблица, с которой я сейчас работаю, имеет около 7 (семи) миллионов строк.   -  person hakiko    schedule 13.10.2014
comment
@Peter, он растет с каждым днем, хочу убедиться, что он работает с большим количеством записей, независимо от того, до какого размера он растет, учитывая характер данных. Он должен иметь возможность расширяться, и я хочу застраховаться от будущего!   -  person user3015175    schedule 13.10.2014
comment
Если бы тысячи наборов данных были большими для mysql, MYSQL был бы мусором и не был бы так популярен, как сегодня. Это очень маленькие наборы данных.   -  person Mubo    schedule 13.10.2014
comment
Покажите данные!!! 10 миллионов строк - это не так уж много. 5500 - это мало... нам нужно увидеть структуру таблицы и некоторые данные, чтобы помочь вам   -  person John Ruddell    schedule 13.10.2014
comment
Миллионы записей в таблице не являются проблемой для MySQL, если вы установили индексы, соответствующие выполняемым запросам.   -  person Mark Baker    schedule 13.10.2014
comment
Начните с чтения об JOIN операторах.   -  person Mike Brant    schedule 13.10.2014


Ответы (2)


Основная проблема с MYSQL не в размере базы данных или количестве записей! Я видел файлы баз данных размером до 10-12 ГБ. Основная проблема может возникнуть, когда вы хотите получить записи, и вы можете столкнуться с проблемой количества запросов, которые вы можете обрабатывать за раз! если вы обратите внимание на то, как вы выполняете свои запросы, никаких серьезных проблем не произойдет.

person Peyman.H    schedule 13.10.2014

То, что вы ищете, называется нормализация базы данных. Основная идея состоит в том, чтобы избежать избыточных данных в таблице и вместо этого сохранить только одно значение (SpeciesNames в вашем случае), на которое вы ссылаетесь.

Таким образом, вместо coords.SpeciesName, который содержит ту же строку, что и common.CommonName, вы должны сохранить ссылку как coords.SpeciesName_id, которая хранит common.ID. Оба поля должны быть типа INT по соображениям производительности, так как их можно сравнивать намного быстрее, чем строки.

Чтобы получить данные из обеих таблиц в одном запросе, вы можете сделать что-то вроде этого:

SELECT * FROM coords JOIN common ON coords.SpeciesName_id = common.ID

Быстрый поиск в Google дает это введение в нормализацию< /а>, например.

Другой поиск по руководству PHP MySQL даст вам подсказки о том, как выполнить запрос с использованием PHP.

person andy    schedule 13.10.2014
comment
Энди, из того, что я понял из вопроса ОП, он имеет дело с матрицей, которой иногда нужны избыточные данные. - person John Ruddell; 13.10.2014
comment
Насколько я понимаю, OP хочет удалить избыточные записи SpeciesName. Конечно, не всегда желательно удалять все лишнее. - person andy; 13.10.2014