Mô hình dữ liệu của bạn dường như không có nhiều ý nghĩa. Bạn có ba thực thể khác nhau admin
, user
và login
. Cả ba người trong số họ dường như lưu trữ thông tin giống nhau - địa chỉ email, tên người dùng và mật khẩu (mà tôi hy vọng về bảo mật cơ bản thực sự là băm mật khẩu). Nếu có bất kỳ mối quan hệ nào giữa các bảng, điều đó vi phạm chuẩn hóa cơ bản vì bạn đang lưu trữ cùng một thông tin ở nhiều nơi.
Không biết các yêu cầu kinh doanh đối với các thực thể mà bạn đang thực sự cố gắng tạo mô hình, rất khó để biết chính xác những gì bạn muốn.
Dự đoán đầu tiên của tôi là bạn có hai loại người dùng, quản trị viên và người dùng thông thường, mỗi loại đều có thể đăng nhập vào ứng dụng của bạn. Giả sử rằng các thuộc tính của người dùng khá nhất quán bất kể vai trò của họ (cả quản trị viên và người dùng thông thường đều có địa chỉ email, mật khẩu, v.v.) thì cách đơn giản nhất để lập mô hình đó là với một login
duy nhất bảng có login_type
điều đó cho bạn biết liệu người dùng cụ thể là quản trị viên hay người dùng thông thường
create table login (
login_id integer primary key,
email varchar2(255),
password_hash raw(32),
login_type varchar2(1) check( login_type IN ('A', 'U') )
);
Bạn có thể làm cho điều đó linh hoạt hơn một chút bằng cách tạo một bảng tra cứu cho các loại đăng nhập mà login
của bạn tham chiếu bảng
create table login_type_lkup (
login_type_code varchar2(1) primary key,
login_type_desc varchar2(255)
);
create table login (
login_id integer primary key,
email varchar2(255),
password_hash raw(32),
login_type_code varchar2(1) references login_type_lkup( login_type_code )
);
Nếu bạn muốn linh hoạt hơn, bước tiếp theo sẽ là nói rằng thông tin đăng nhập không thực sự có một loại. Thay vào đó, họ có một hoặc nhiều vai trò có một số quyền. Bạn có thể có admin
vai trò và regular user
vai trò ban đầu nhưng sau đó muốn thêm một read only user
vai trò, một superuser
vai trò, v.v. Trong trường hợp đó, bạn sẽ có một cái gì đó giống như
create table login (
login_id integer primary key,
email varchar2(255),
password_hash raw(32)
);
create table role (
role_id integer primary key,
role_desc varchar2(255)
);
create table permission (
permission_id integer primary key,
permission_desc varchar2(255)
);
create table login_role (
login_id integer references login(login_id),
role_id integer references role(role_id),
primary key pk_login_role( login_id, role_id )
);
create table role_permission (
role_id integer references role(role_id),
permission_id integer references permission(permission_id),
primary key pk_role_permission( role_id, permission_id )
);