2013-07-15 6 views
0

URL을 url 필드에 저장하는 MySQL MyISAM 테이블이 있습니다. URL은 항상 체계, 하위 도메인 및 호스트입니다 (예 : http://www.site.com 또는 https://site2.edu).MySQL의 트리거를 사용하여 URL 필드를 분해하고 MyISAM 테이블에 그 부품을 저장하십시오.

색인을 생성하고 검색 할 수 있도록 도메인, 하위 도메인 및 스키마를 자체 필드에 저장해야합니다. 내 시스템이 수백만 행에 대해 LIKE 쿼리를 수행하는 것은 너무 느립니다.

  • 도메인 : site.com, site2.com
  • 하위 도메인 : www가 ','
  • 계획 : HTTP, HTTPS

내가 만들려면 어떻게해야합니까 MySQL의 트리거가이 작업을 수행하려면? URL 필드에서 Domain, Subdomain 및 Scheme을 업데이트 할 때마다 추출하고 각 필드에 저장해야합니다 (예 : domain, subdomain, scheme).이 필드는 MySQL 트리거에 의해서만 기록됩니다.

URL 구문 분석은 흔하지 않은 경우가 많으므로 대부분 이런 식으로 트리거를 설정하는 것에 관심이 있습니다. 내 애플리케이션에서 URL 구문 분석의 품질을 조정하고 상쇄 할 수 있습니다.

+0

우선 "* domain *"은 잘 정의되어 있지 않습니다. "도메인"이 끝나는 위치와 하위 도메인/호스트가 시작되는 위치를 결정하는 쉬운 방법은 없습니다 (문제의 도메인 운영자가 의미 론적으로 구분하고 다른 곳과 구별 할 수 없기 때문에) ... 가장 일반적인 접근 방법은 공개 도메인 등록이 이루어진 수준을 결정하기 위해 Mozilla의 [Public Suffix List] (https://wiki.mozilla.org/Public_Suffix_List)를 사용하는 것입니다. 그 아래에 개인 호스트/하위 도메인이 있다고 가정합니다. 그러나 그것은 간단하지 않습니다. – eggyal

+0

왜 index 태그입니까? –

+0

Amazon의 RDS를 사용하는 경우 트리거 설정은 매우 복잡합니다 (http://stackoverflow.com/questions/8919907/can-i-create-trigger-in-an-rds-db). 코드에이 동작을 넣는 것이 더 쉬울 수 있습니다. –

답변

1
DELIMITER // 

DROP TRIGGER IF EXISTS url_trigger_before_insert // 

CREATE TRIGGER url_trigger_before_insert 
BEFORE INSERT ON url_table 
FOR EACH ROW 
BEGIN 
    DECLARE no_proto CHAR; 
    SET NEW.scheme = SUBSTRING_INDEX(NEW.url, ':', 1); 

    SET @no_proto = REPLACE(NEW.url,CONCAT(NEW.scheme,'://'),''); 

    SET @no_proto = SUBSTRING_INDEX(@no_proto, '/', 1); 

    SET NEW.subdomain = SUBSTRING_INDEX(@no_proto, '.', 1); 
    SET NEW.host = SUBSTRING_INDEX(@no_proto, '.', -2); 

END // 

DROP TRIGGER IF EXISTS url_trigger_before_update // 

CREATE TRIGGER url_trigger_before_update 
BEFORE UPDATE ON url_table 
FOR EACH ROW 
BEGIN 
    DECLARE no_proto CHAR; 
    SET NEW.scheme = SUBSTRING_INDEX(NEW.url, ':', 1); 

    SET @no_proto = REPLACE(NEW.url,CONCAT(NEW.scheme,'://'),''); 

    SET @no_proto = SUBSTRING_INDEX(@no_proto, '/', 1); 

    SET NEW.subdomain = SUBSTRING_INDEX(@no_proto, '.', 1); 
    SET NEW.host = SUBSTRING_INDEX(@no_proto, '.', -2); 

END // 


DELIMITER ; 
+0

이 작업은 'url' 필드에 대한 UPDATE에도 가능합니까? –

+0

BEFORE UPDATE 조건에 대한 두 번째 트리거를 만들 수 있습니다. 편집을 참조하십시오. – Drew