2013-07-14 2 views
1

하나의 테이블에 저장해야하는 일반적인 데이터와 일반적인 데이터가있는 소스 (웹 페이지)가 있습니다.다른 컬럼으로 테이블 생성하기 inserts

데이터는 다음과 같이 할 수 있습니다

model: xyz, attr_1: xyz, attr_2: xyz 
model: xyz, attr_3: xyz, attr_4: xyz 
model: xyz, attr_1: xyz, attr_4: xyz 
model: xyz, attr_1: xyz, attr_5: xyz 
model: xyz, attr_15: xyz, attr_20: xyz 

이 데이터는이 DML을 생성합니다

insert into table (model, attr_1, attr_2)values('xyz','xyz','xyz'); 
insert into table (model, attr_3, attr_4)values('xyz','xyz','xyz'); 
insert into table (model, attr_1, attr_4)values('xyz','xyz','xyz'); 
insert into table (model, attr_1, attr_5)values('xyz','xyz','xyz'); 
insert into table (model, attr_15, attr_20)values('xyz','xyz','xyz'); 

내 문제는 삽입 그래서 내가 할 수있는 명령 전에 테이블을 정의 할 수 있다는 것입니다 열을 알고 새로운 열을 발견 할 때마다 새로운 열을 발견 할 수 있습니다. 실제 삽입 전에 모든 insert 명령을 가져올 수 없습니다. 내가 생각하는 유일한 방법은 (create table as insert into을 사용하여) 다른 테이블에 모든 행을 삽입 한 다음 UNION ALL을 사용하여 최종 테이블을 만드는 것입니다. 그러나이 소리는별로 좋지 않습니다.

EDIT 정규화 된 테이블을 찾고 있지 않습니다.

최종 결과는합니다 (예를 들어,로)해야한다 :

table_name 
id  int 
model varchar 
attr_1 varchar 
attr_2 varchar 
attr_3 varchar 
attr_4 varchar 
attr_5 varchar 
attr_15 varchar 
attr_20 varchar 
+0

을 : 데이터를 검색하려면

,이 같은 참여 간단한 사용합니다. – mvp

답변

1

이에 정말 간단한 해결책이있다. 당신은 당신의 테이블을 변경해야합니다 : 당신이 INSERT을 수행 할 때 다음

table: model 
modelName attribute value 
xyz  1   xyz 
xyz  2   xyz 

을, 당신은 할 것 :

INSERT INTO `model` (`modelName`, `attribute`, `value`) VALUES ('xyz', 1, 'xyz') 

이 속성의 n 시간 동안 할 수있는 정규화 된 테이블 구조입니다.

0

배열을 사용하여 데이터를 얻는 경우 PHP의 implode(', ', $array)을 사용할 수 있습니다. 그러나 PHP를 사용하지 않을 수도 있습니다. 그렇다면 항상 INSERT,과 연결할 수 있습니다.

0

올바른 해결책은 스키마를 표준화하는 것입니다.

2 개의 테이블을 만듭니다 : 메인 모델의 마스터 테이블 - 당신이 지금 가지고있는 것만 큼, 속성은 없으며, 슬레이브 테이블은 속성을 유지합니다. 다음과 같은 것 :

CREATE TABLE master (
    master_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    model VARCHAR(50) 
); 

CREATE TABLE attrs (
    attr_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    master_id INTEGER NOT NULL, 
    attr_name VARCHAR(20) 
); 

이 스키마는 다소 컴팩트하며 몇 가지 중요한 속성이 있습니다. 예를 들어 주어진 모델과 관련된 임의의 수의 속성을 유지할 수 있습니다. 0 일 수도 있고 1000 일 수도 있습니다.

데이터를 삽입하려면 먼저 마스터 테이블에 삽입 한 다음 attrs 테이블에 삽입해야합니다 . 당신이 당신의 케이크를 먹을 수 없습니다 아직도 그것을 가지고, 당신이 그것을 간단하게하지 그것을 정상화 할 수없는 많은처럼

SELECT m.model, 
     a.attr_name 
FROM master m 
JOIN attrs a ON m.model_id = a.model_id 
WHERE ...