【发布时间】:2020-08-07 12:13:54
【问题描述】:
我的问题:
我有一个应用,登录的用户有一个部门授权列表:
DEPT1, DEPT2, DEPT3, ..., DEPT5000, DEPT5001, ...
大多数用户的个人资料中分配了 5,000 多个部门。
我的任务是编写一个数据模型 + 应用程序代码,该代码将在用户每次登录时“快照”他们的授权部门列表,以便我们可以参考该用户被授权执行的操作(注意:部门 ID 是没有像本例中那样整齐地编号)。
我尝试过的:
我的第一个想法是将部门列表变成一个长的 CSV 字符串,并将其存储为 CLOB:
CREATE TABLE UI_SECURITY_CONFIG (
SECURITY_CONFIG_ID NUMBER(19,0) NOT NULL,
DEPTSCSV CLOB NOT NULL
);
每个DEPTSCSV CLOB 都是独一无二的。如果用户与以前登录的其他人具有相同的安全配置文件,它只会选择该安全配置。否则,它将创建一个新行。基本上,选择 DEPTSCSV = 'DEPT1, DEPT2, DEPT3 ...' 如果它不存在,则插入它。但是这种方法失败了,因为一个巨大的字符串(25,000+ 字符)无法比较:
SELECT * FROM UI_SECURITY_CONFIG WHERE DEPTSCSV = 'DEPT0001, DEPT0002, DEPT0003, ..., DEPT5001, DEPT5002'
SQL Error [1704] [42000]: ORA-01704: string literal too long
解决方案尝试 #2:
然后我考虑让 CSV 中的每个项目在表格中成为自己的行:
CREATE TABLE UI_SECURITY_CONFIG (
SECURITY_CONFIG_ID NUMBER(19,0) NOT NULL,
DEPTID VARCHAR2(20) NOT NULL
);
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0001');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0002');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0003');
...
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT5001');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT5002');
但我正在努力编写 SQL 选择,这将是一种有效的匹配算法来查找是否存在与部门列表完全匹配的 SECURITY_CONFIG_ID。
我什至不确定是否有解决此问题的有效方法。
解决方案尝试 #3:
询问堆栈溢出。你会怎么做?
【问题讨论】:
标签: oracle data-modeling datamodel