2014-10-13 5 views
0

일반적인 'SpeciesName'필드를 공유하는 두 테이블의 데이터에 액세스하려고합니다.대형 데이터 세트가있는 MySQL 관계형 데이터베이스?

'coords'테이블은 5500 개가 넘는 매우 큰 데이터 세트이며 테이블 자체에는 약 26 개의 필드가 있습니다. 이 테이블의 고유 ID는 0-5500까지 실행되는 행렬 번호이며 각 행에는 약간 고유 한 데이터가 들어 있습니다. 그러나 'SpeciesName'이 동일한 행이 여러 개 있습니다. 테이블 내에 고유 한 'SpeciesNames'만 있습니다.

표 'common'에는 3 개의 필드가있는 각 'SpeciesNames'에 대한 일반 이름과 이미지 데이터가 저장됩니다. 기본적으로 내가 뭘하려고하는지 외래 키로 'SpeciesNames'를 사용하여 두 테이블 사이의 MySQL 관계를 설정하고 둘 다 하나의 쿼리에서 데이터에 액세스합니다.

어디서부터 시작해야할까요? 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`) 

'이 coords'-이'좌표 '입니다 이미 성공적으로 달성되었습니다. 'common'테이블에는 각 'SpeciesName'(coords.SpeciesName 및 common.ID)에 대해 동적으로 생성 된 새로운 정보가 포함되어 있으므로 CommonName을 표시하고 'ImageUrl'및 'UploadedImgUrl'을 데이터와 함께 사용하고 싶습니다. 이전에 가지고 있었다. 나는 여전히 MySQL에 대한 약간의 초보자이므로, 나의 용어가 완벽하지 않다면 사과드립니다.

+0

5500 레코드가 크지 않습니다. 당신의 문제/상황이 내게는 분명하지 않지만, 당신은 다분히 많은 관계가 필요하다고 생각합니다. – Peter

+1

belive me 5500은 mysql에 대해 매우 작은 크기입니다. 예를 들어 현재 작업중인 테이블의 크기는 약 7 (7) 백만 행입니다. – hakiko

+0

@Peter는 날이 갈수록 데이터의 성격을 고려하여 어떤 크기로 커 졌는지에 관계없이 더 많은 양의 레코드로 작동하도록하고 싶습니다. 확장 할 수 있어야하며 미래에 대비해야합니다. – user3015175

답변

0

당신이 찾고있는 것을 database normalization이라고합니다. 기본 아이디어는 테이블에 중복 데이터가있는 것을 피하고 참조하는 단일 값 (사례의 SpeciesNames) 만 유지하는 것입니다. 그래서 그 대신 당신이 common.ID 저장 coords.SpeciesName_id로 참조를 저장하는 것 common.CommonName와 같은 문자열을 포함 coords.SpeciesName를 갖는의

. 문자열보다 훨씬 빠르게 비교할 수 있기 때문에 두 필드 모두 perfomance resons에 대해 INT 유형이어야합니다.

은 같은 것을 할 수 있고, 단일 쿼리에서 두 테이블에서 데이터를 가져올 수 :

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

구글에 대한 빠른 검색은 예를 들어,이 intro to normalization을 얻을 수 있습니다.

PHP MySQL tutorial에 대한 또 다른 검색은 PHP를 사용하여 쿼리를 실행하는 방법에 대한 힌트를 제공합니다.

+1

andy 내가 OP의 질문에서 이해할 때 매트릭스가 때때로 중복 된 데이터를 필요로한다는 것을 이해했습니다. –

+0

OP에서 중복 된 SpeciesName 항목을 제거하려고합니다. 물론 모든 중복성을 제거하는 것이 항상 바람직한 것은 아닙니다. – andy

0

MYSQL의 주요 문제점은 데이터베이스 크기 나 레코드 수가 아닙니다! 데이터베이스 파일을 최대 10-12GB까지 보았습니다. 주요 문제는 레코드를 가져오고 한 번에 처리 할 수있는 쿼리의 수에 문제가 발생할 수있는 경우 발생합니다! 당신이 당신의 질문을 수행하는 방식에주의를 기울인다면 심각한 문제는 발생하지 않을 것입니다.

관련 문제