2010-11-23 3 views
3

현재 사이트의 데이터베이스를 재구성하려고합니다. 지금 가지고있는 스키마가 최고가 아니기 때문에 몇 가지 제안을 듣는 것이 유용 할 것이라고 생각했습니다.위젯 구동 사이트에 대한 데이터베이스 스키마 제안

시작하려면 내 사이트는 실제로 위젯으로 구성됩니다. 각 위젯에 대해 settings (위젯의 각 인스턴스에는 사용자 정의 설정이 있음) 테이블, common (동일한 위젯의 인스턴스간에 공유 항목) 및 (사용자의 위젯 인스턴스 내에 저장된 데이터) 테이블이 필요합니다.). (

  • 첫 번째 데이터베이스, 나는 모든 사이트 유지 보수 테이블을했다 예를 들어, 사용자, 위젯 설치, 로그, 알림 메시지 등 :

    은 지금까지 나는이 데이터베이스 구성, 다음 스키마를했다) 내가 각 위젯 인스턴스를 인스턴스화 한 각 사용자에게 고유 한 ID를 할당 한 테이블을 추가합니다 (따라서 다음 열이 있습니다 : user_id, widget_idunique_id).

  • 두 번째 데이터베이스에서 위젯 관련 데이터를 모두 보관했습니다. 즉, 각 도구 (widget_id으로 고유)에 대해 나는 [widget_id]_settings, [widget_id]_common[widget_id]_userdata의 세 가지 테이블을 가지고있었습니다. 각 표에서 각 행은 사용자 위젯 unique_id을 보유하고 있습니다. 사실 여기에 모든 사용자의 데이터가 위젯에 저장되었습니다.

    먼저 데이터베이스 : 다음 users 테이블에서

    • 나는 내가 widgets 표에서 user_id = 1
    • 을 가지고있다 widget_id = 1

    내 데이터베이스가 어떻게 작동하는지에 대한 간단한 예제를 제공합니다 내가 가진 users_widgets 테이블에 user_id = 1, widget_id = 1, unique_id = 1

두 번째 데이터베이스 ... 사용자의 위젯 설정을 나타냅니다 내가 unique_id = 1, ...이있는 1_settings에서는

  • 내가 같은 위젯의 인스턴스간에 공유 된 데이터를 나타내는 여러 행이있는 1_common에서
  • (여기에 사용자 별 데이터가 없습니다.)
  • 1_userdata에는 unique_id = 1, ...이 있는데 ...은 사용자의 위젯 데이터를 나타냅니다. 여기서 중요한주의 사항이 테이블

당신이 거친 내 데이터베이스 스키마 이해 희망 (위젯 예를 들어, 예를 들어 작업 위젯를 들어, 사용자가 가질 수있는 몇 가지 작업) 같은 unique_id으로 여러 행을 포함 할 수 있다는 것이다.

이제는 '클리너 (cleaner)'스키마를 개발하고자하므로 2 개의 데이터베이스를 가질 필요가 없으며 애플리케이션마다 매번 전환해야합니다. 만약 내가 두 번째 데이터베이스 (1_settings, 2_settings, ..., n_settings)에 테이블을 dinamically 생성하지 않는 방법을 찾으면 좋을 것입니다.

이 작업을 수행하는 더 나은 방법을 제안하는 데 많은 노력을 기울여야합니다. 대단히 감사드립니다!

편집 : 내 데이터베이스를 재구성 할 때 MongoDB 또는 CouchDB와 같은 데이터베이스를 사용할 수 있습니까? 내 말은, 두 번째 데이터베이스의 경우 고정 된 스키마가없는 것이 더 좋을 것입니다. 또한 전통적인 SQL과 NoSQL은 어떻게 동일한 사이트에서 작동합니까?

답변

6

users_widgets 테이블 가능한 스키마가 될 수있다 : 당신이 어떤 이유로 기본 키를 숨기려하지 않는

id | user_id | widget_id 

당신은 users_widgets 테이블의 unique_id 필드가 필요하지 않습니다. 사실,이 테이블의 이름을 widget_instances과 같이 약간 더 기억하기 쉽도록 수정하고 두 번째 데이터베이스의 나머지 테이블에서 widget_instance_id을 사용합니다. USER_ID가 widget_instance_id 관련이 있기 때문에,의 유저 데이터를 포함 할 것

widget_instance_settings

id | widget_instance_id | key | value 

이 : 테이블의 두 번째 세트를 처리 할 수 ​​

한 가지 방법은 메타 데이터 스타일을 사용하는 것입니다 사용자가 동일한 위젯의 여러 인스턴스를 작성하고 어떤 이유로 든 모든 인스턴스에서 동일한 데이터를 가지도록하려는 경우가 아니면 예외입니다.

widget_common_settings

id | widget_id | key | value 

스키마의이 유형은 Elgg 같은 패키지에서 볼 수 있습니다.

+0

위대한 사용자로부터 또 다른 위대한 제안! :) 당신의 제안은 상당히 견고하고 확장 성이 있습니다.이렇게하면 첫 번째 데이터베이스에 3 개의 테이블을 통합 할 때 두 번째 데이터베이스가 필요하지 않을 것입니다. 내 질문은, 만약 내가 1000 위젯 인스턴스, 예를 들어, 5 개의 다른 설정과 각 위젯 - 즉, 내'widget_instance_settings' 5000 행에있다 의미합니다. 그리고 이것은 사용자가 생성하는 모든 위젯 인스턴스에 따라 증가합니다. MySQL은 한 테이블 내에서 이렇게 많은 양의 데이터를 처리 할 수 ​​있습니까? – linkyndy

+0

또한 언급 한 스키마를 사용하면 데이터베이스 테이블 내에서 'n'행으로 구성된 특정 위젯 인스턴스를 처리하기가 Cake (이 프레임 워크에서이 프로젝트를 개발할 때)에서 쉽게 수행 할 수 있습니까? (여기서 'n'은 위젯이 가질 수있는 설정 수입니다). 그리고 위젯을 공유 할 계획입니다 (즉, 한 사용자의 위젯 인스턴스에서 모든 데이터를 다른 사용자의 인스턴스로 복사). 달성하기가 쉬운가? 당신의 도움을 주셔서 대단히 감사합니다. – linkyndy

+0

확실히. 'widget_instance_id' 칼럼과'key' 칼럼까지도 INDEX로 지정하십시오. 이 스키마를 CakePHP와 함께 사용하면 문제가 없어야합니다. – RabidFire

0

위젯 클래스 및 위젯 인스턴스가 가질 수있는 설정을 알고 있습니까? 이 경우 이러한 설정은 widget_class 테이블 (공통 설정) 및 widget_instance (예 : 특정 설정)의 열로 만들 수 있습니다.
이들을 모르는 경우 widget_class 테이블과 다 대일 관계가있는 widget_class_settings 테이블과 widget_instance 테이블과 다 대일 관계가있는 widget_instance_settings를 가질 수 있습니다. widget_instance와 widget_class 사이에는 다시 하나의 관계가 있습니다. widget_instance는 사용자 테이블에 외래 키를 가질 수 있으므로 어떤 사용자가 특정 위젯을 만들 었는지 알 수 있습니다.

+0

테이블을 약간 섞어서, 아마도 내가 설명에서 분명하지 않았을 것입니다. 사용자는 위젯을 생성하고 내 사이트에 업로드 할 수 있으며 사용자는 위젯을 사용할 수 있습니다. 이 두 가지 이야기가 있습니다. 나는 첫번째 것에 문제가 없으며, 두번째 것에 대해서만 문제가있다. 새로운 위젯이 설치되면, 세 번째 테이블이 두 번째 데이터베이스에 생성됩니다 (이것은 지금 일어나는 일입니다). 3 개의 테이블 각각에는 위젯이 필요로하는 것과 같은 미리 정의 된 스키마가 있습니다 (태스크 위젯에는'task_name' 컬럼이 필요하고 노트 위젯에는'note_content' 컬럼이 필요합니다). 따라서 모든 열은 사전 정의됩니다. – linkyndy

+0

이제 사용자가 위젯을 사용하기 시작할 때 첫 번째 데이터베이스의 'users_widgets' 테이블에'unique_id '라는 새로운 행을 추가합니다. 그런 다음,'unique_id'를 사용하여 두 번째 데이터베이스의'[widget_id] _settings'에 새 행을 추가합니다. 설정 행은 필수 항목입니다. 각 위젯 인스턴스는 설정 테이블에 등록되어야합니다. 사용자가 무언가 (예 : 작업)를 추가하면 '[widget_id] _userdata' 행에'unique_id '를 사용하여 행이 만들어집니다. 내가 알고 싶었던 점은이 시스템을 어떻게 개선 할 수 있는가하는 것입니다. 두 개의 데이터베이스가 없기 때문에 'n'테이블로 구성됩니다. 감사합니다! – linkyndy

관련 문제