다중 테넌트 mysql 데이터베이스를 설계하는 방법
여러 회사의 데이터를 호스팅할 데이터베이스를 설계해야 한다고 가정해 보겠습니다.이제 보안 및 관리 목적으로 여러 회사의 데이터가 적절하게 격리되었는지 확인해야 하지만 10개의 다른 서버에서 10개 회사의 데이터를 호스팅하는 10개의 mysql 프로세스를 시작하고 싶지도 않습니다.mysql 데이터베이스로 이것을 하는 가장 좋은 방법은 무엇입니까?
멀티 테넌트 데이터베이스에는 여러 가지 접근 방식이 있습니다.토론을 위해 보통 세 가지로 나뉩니다.
- 테넌트당 하나의 데이터베이스.
- 공유 데이터베이스, 테넌트당 하나의 스키마.
- 공유 데이터베이스, 공유 스키마.테넌트 식별자( 테넌트 키)는 모든 행을 올바른 테넌트와 연결합니다.
MSDN에는 각 설계의 장단점과 구현 예에 대한 좋은 기사가 있습니다.
Microsoft has apparently taken down the pages I referred to, but they are on on archive.org. Links have been changed to point there.
MySQL에서는 모든 테넌트에 대해 단일 데이터베이스를 사용하는 것을 선호합니다.해당 테넌트에 속한 행만 표시되는 보기에 액세스할 수 있는 각 테넌트에 대해 별도의 데이터베이스 사용자를 사용하여 데이터에 대한 액세스를 제한합니다.
이 작업은 다음과 같이 수행할 수 있습니다.
- 모든 테이블에 tenant_id 열 추가
- 트리거를 사용하여 삽입 시 tenant_id를 현재 데이터베이스 사용자 이름으로 채웁니다.
- tenant_id = current_layout_layout이 있는 각 테이블에 대한 보기를 만듭니다.
- 응용프로그램에서 보기만 사용
- 테넌트 특정 사용자 이름을 사용하여 데이터베이스에 연결
저는 이 내용을 블로그 포스트에 완전히 기록했습니다. https://opensource.io/it/mysql-multi-tenant/
간단한 방법은 각 공유 테이블에 대해 SEGENT_ID라고 표시된 열을 추가하는 것입니다.각 고객에게 적합한 SEGENT_ID를 할당했습니다.그런 다음 SEGENT_ID를 기반으로 각 고객별 뷰를 작성하면 이러한 뷰는 각 고객과 데이터를 분리된 상태로 유지됩니다.이 방법을 사용하면 정보를 공유할 수 있어 운영 및 개발을 쉽게 할 수 있습니다(저장된 절차도 공유할 수 있습니다).
하나의 MySQL 인스턴스에서 하나의 MySQL 데이터베이스를 실행한다고 가정할 때, 누구의 것인지 구별하는 몇 가지 방법이 있습니다.(적어도 저에게는) 가장 확실한 선택은 다음과 같은 복합 기본 키를 만드는 것일 것입니다.
CREATE TABLE some_table (
id int unsigned not null auto_increment,
companyId int unsigned not null,
..
..
..,
primary key(id, company_id)
) engine = innodb;
기본 키의 companyId 부분을 변경하여 회사를 구분합니다.이렇게 하면 모든 회사의 모든 데이터를 동일한 테이블/데이터베이스에 저장할 수 있으며 애플리케이션 수준에서 어떤 회사가 어떤 회사 ID에 연결되어 있는지 제어하고 특정 회사에 대해 어떤 데이터를 표시할지 결정할 수 있습니다.
만약 이것이 당신이 찾던 것이 아니었다면, 당신의 질문을 오해한 것에 대해 사과드립니다.
회사마다 다른 스키마를 만드는 것을 고려해보셨습니까?
하지만 여러분은 여러분이 성취하고 싶은 것을 더 정확하게 정의하려고 노력해야 합니다.
예를 들어 HW 장애로 인해 여러 회사의 데이터가 손상되지 않도록 하려면 다른 인스턴스를 생성하고 다른 노드에서 실행해야 합니다.
예를 들어, A사의 누군가가 B사에 속한 데이터를 볼 수 없도록 하려면 Matthew PK 답변과 같이 애플리케이션 레벨에서 이를 수행할 수 있습니다.
보안을 위협하고 DB에 대해 임의 SQL을 실행할 수 있는 사용자가 있는지 확인하려면 그 이상의 강력한 기능이 필요합니다.
월요일에는 C사를, 일요일에는 A사를 안전하게 백업하고 C사만 복원할 수 있도록 데이터를 독립적으로 백업할 수 있다면 순수한 애플리케이션 기반 솔루션으로는 도움이 되지 않습니다.
특정 DB 사용자가 있을 경우, 접근이 허용된 회사를 나타내는 사용자 구성원 자격을 그룹에 부여할 수 있습니다.
Companies따라서하십시오 사이에 . 따라서 다음과 같이 일대일 관계를 만듭니다.Companies그리고.MySQLUsers혹은 비슷한 것.
으로 , 의 의 으로 만 만 의 의 CompanyID하여에 UserID
내 파일에서 Generate_multiTanentMysql.phpi는 PHP 스크립트로 모든 단계를 수행합니다.
https://github.com/ziedtuihri/SaaS_Application
솔루션 설계 패턴:
각 테넌트에 대한 데이터베이스 사용자 생성
모든 테이블 이름을 다른 고유 이름으로 변경(예: 접두사 'some prefix_' 사용)
행이 속한 테넌트의 이름을 저장하기 위해 모든 테이블에 'id_tenant'라는 텍스트 열 추가
새 행을 삽입하기 전에 id_tenant 열에 현재 데이터베이스 사용자 이름을 자동으로 저장하도록 각 테이블에 대한 트리거 만들기
id_tenant를 제외한 모든 열이 있는 원래 테이블 이름으로 각 테이블에 대한 보기를 만듭니다.보기는 (id_tenant = current_limit_limit)인 행만 반환합니다.
각 테넌트의 데이터베이스 사용자에게 테이블이 아닌 보기에만 사용 권한을 부여합니다. 그러면 애플리케이션에서 변경해야 하는 부분은 데이터베이스 연결 로직뿐입니다.누군가가 SaaS에 연결할 때 애플리케이션은 다음과 같은 작업을 수행해야 합니다.
해당 테넌트 관련 사용자 이름으로 데이터베이스에 연결
언급URL : https://stackoverflow.com/questions/5570102/how-to-design-a-multi-tenant-mysql-database
'programing' 카테고리의 다른 글
| AVAssetReader로 파형 그리기 (0) | 2023.09.06 |
|---|---|
| 최소 키의 자녀 내부 부모: 100% 키를 상속하지 않음 (0) | 2023.09.06 |
| 매트플롯 리브 '백엔드'를 설정하려면 어떻게 해야 합니까? (0) | 2023.09.06 |
| 장인 마이그레이션 오류 140 잘못된 생성 옵션 (0) | 2023.09.06 |
| 사용자 지정 개체를 소포 가능하게 하려면 어떻게 해야 합니까? (0) | 2023.09.06 |