2012-04-18 4 views
0

2 개의 테이블로 나눌 것인지 아닌지에 대한 약간의 딜레마가 있으며, 텍스트 컬럼을 포함하는 큰 (수백 K 레코드) 테이블입니다.ORMS 뒤의 텍스트 컬럼을 가진 MySQL 대형 테이블

질문 상점 뉴스 기사의 표 :

CREATE TABLE `article` (
    `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `articleType` varchar(7) DEFAULT NULL, 
    `dateCreated` datetime NOT NULL, 
    `label` varchar(75) NOT NULL, 
    `lastUpdated` datetime NOT NULL, 
    `reporter` mediumint(8) unsigned NOT NULL, 
    `text` text NOT NULL 
    PRIMARY KEY (`id`), 
    KEY `reporter-fk` (`reporter`), 
    CONSTRAINT `reporter-fk` FOREIGN KEY (`reporter`) REFERENCES `reporter` (`id`) 
) 

그래서 큰 문제는, 당신은 (최신 뉴스) 헤드 라인을 얻으려면 바로 SQL에서 당신은 당신이 원하는 열 (ID, 라벨을 잡아 것입니다, 모두 포함 dateCreated) 및

ORM 작업, 그러나, 객체가 페치 원하지 않는 사람 (특히 비 대한 텍스트 열) 제외, 그래서 가장 최근의 50 잡아 기사가 약간의 간접비를 초래할 것입니다, 어쩌면 엄청나게 그렇게하지는 않을 것입니다. 이 경우에는 SQL을 작성할 때 모든 필드를 포착하지 않으려 고합니다.

ORM 현실을 감안할 때 텍스트 열을 별도의 관련 테이블로 나눌 필요가 없거나 ORM grab-the-whole-enchilada 규칙을 따르고 사이트 트래픽이 더 효율적일 때 걱정할 필요가 없습니다. , 2 테이블 솔루션?

답변

1

일반적으로 나는 성급하게 최적화하지 말라.

그러나이 경우에는 이미이를 수행 할 인수가 있으므로 지금은 설명해 드리겠습니다. 시체를 표시하지 않고 기사 머리글 목록을 표시하고있는 것 같습니다. 기사와 관련된 자신의 테이블/클래스에 시체를 두지 않으시겠습니까?

기사 헤더와 기사 본문은 이미 두 개의 개별적인 것으로 보입니다.

+0

생산 중에는 ORM이없는 단일 테이블, 문자열 기반 SQL이 있습니다. 개발 중에는 모든 쿼리에 대해 기사 텍스트를 포함한다는 (완벽 주의자) 생각을 다룰 수 없어서 테이블이 깨졌습니다. 이 게시물은 ORM 컨벤션으로 가거나 SQL 컨벤션으로 가고 싶습니다. 필자가 가장 선호하는 것은 후자입니다. – virtualeyes

1

특정 ORM을 사용하고 있습니까? 아니면 자체 개발 한 ORM을 사용하고 있습니까? Propel을 사용할 경우 지연로드이되도록 열을 설정하면 나머지 객체가 아닌 명시 적 요청시로드됩니다. 그렇지 않다면, 당신의 ORM이 이것을 지원하는지 아니면 빌드 하는지를 확인하십시오.

+0

기술적으로 ORM이 아닌 ScalaQuery를 사용하고 있습니다. LINQ가있는 기능적인 JDBC 래퍼가 더 많이 있습니다. SQL과 같은 능력. 특정 열을 게으른로드하는 것은 멋지지만 ScalaQuery는 그러한 매핑을 기본적으로 제공합니다. 나는 쿼리에서 반환 된 객체 (들)에 반대하지 않는다는 것을 지적해야한다. (사실 아주 좋음). 그러나 부엌 싱크대가 던져 질 때 객체의 무게와 무게가 나간다. 나는 나누기 위해 기울어 져있다. 테이블, 가능성이 도로 아래 두통을 저장합니다 ... – virtualeyes

+0

아, 구걸 사면 - 내가 당신의 태그 목록에서 PHP를 보았다고 생각. 나는 두뇌에 PHP를 가지고있어! 빠른 검색은 ScalaQuery에 게으른 로딩이 없다는 것을 암시하지만, 여기에 [Hibernate의이 기능]에 대한 정보가 있습니다 (http://stackoverflow.com/questions/2192242/what-is-lazy-loading-in-hibernate). – halfer

+0

글쎄, ScalaQuery에서 (나는 조금 거짓말을했다.) 칼럼을 지정할 수 있었지만, 객체를 다루는 것이 더 현명했고, 스칼라와 같은 정적으로 타입이 지정된 언어에서, 일부 보일러 플레이트 (select foo, bar, baz는 각 열의 유형 [(String, Int, Date)]을 지정한 다음이 터플을 전달한다는 것을 의미합니다. 이는 자동 완성 IDE를 얻을 수있는 Foos 목록으로 작업하는 것보다 덜 편리합니다. 어쨌든, 고맙게도 PHP가 아니고, 10 년 동안 LAMP stackin '을 스파게티로 끝냈습니다 ;-) – virtualeyes