回答

收藏

防止在数据库中使用重复的标签

技术问答 技术问答 96 人阅读 | 0 人回复 | 2023-09-13

我想知道如何防止在数据库表中使用两个相同的标签。有人说我在表中使用两个私钥。但是,W3Schools-网站表示这是不可能的。
% F9 I  B3 Z. s. t               
0 }; O8 E- x+ s7 B5 m解决方案:; x5 q$ L3 y9 r9 t
                5 T# O0 ^& M4 P7 }/ t0 A
* U: |# [# V' k( C# D

( j1 D0 k) t, Q8 t3 }2 A) P6 m- l                我已经更新了NORMA模型,使其与您的图表更加匹配。我可以看到您在哪里犯了一些错误,但是其中一些错误可能是由于我的早期模型造成的。* s  v6 K" n- v: W7 G  t; \: }$ C
我已更新此模型以防止重复标签。以前真的没关系。但是,既然您想要它,这里就是(对于Postgres):8 M9 u7 E# C$ W
START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE;
1 x  z" ^+ J2 yCREATE SCHEMA so;; J0 v8 k! f; L- f2 |
SET search_path TO SO,"$user",public;- q* _8 q. y: A& p
CREATE DOMAIN so.HashedPassword AS
8 u+ s$ D/ m3 {2 z$ N( @    BIGINT CONSTRAINT HashedPassword_Unsigned_Chk CHECK (VALUE >= 0);
3 `( P9 Q( J7 g: y% mCREATE TABLE so."User"- c1 u: B. Z( B8 G
(
6 j- S6 h. N% j( u% Y    USER_ID SERIAL NOT NULL,4 Z. f. @: A  ]) K5 \" a
    USER_NAME CHARACTER VARYING(50) NOT NULL,
, B& c9 F5 H& k    EMAIL_ADDRESS CHARACTER VARYING(256) NOT NULL,
  Q! ^  s/ o. _' q' |    HASHED_PASSWORD so.HashedPassword NOT NULL,! O- T/ H9 y1 m6 {: t& F/ f+ w
    OPEN_ID CHARACTER VARYING(512),1 e4 ^. u, d, B2 U
    A_MODERATOR BOOLEAN,: G( i0 z5 u% I
    LOGGED_IN BOOLEAN,
( E4 C& ?& x* i% Z% p( l    HAS_BEEN_SENT_A_MODERATOR_MESSAGE BOOLEAN,' S: i; @( C( _2 I# b, g
    CONSTRAINT User_PK PRIMARY KEY(USER_ID)' W  _9 ~5 H# y
);
* H: k; [' i; g9 R/ SCREATE TABLE so.Question7 i0 j5 Z( L4 }( W. a
(
$ h) a  v; K0 \  Z; @& O5 d" M    QUESTION_ID SERIAL NOT NULL,
5 a* m( M, p; a( L7 W" G) R    TITLE CHARACTER VARYING(256) NOT NULL,# e1 `  E7 j* L/ v( |
    WAS_SENT_AT_TIME TIMESTAMP NOT NULL,  F' W- R4 N" i, v
    BODY CHARACTER VARYING NOT NULL,
; R% b2 e0 w. F1 D1 N5 Z& B* c    USER_ID INTEGER NOT NULL,! h! n& a1 y5 X8 `
    FLAGGED_FOR_MODERATOR_REMOVAL BOOLEAN,, _# n+ @; w; D$ g' o, F
    WAS_LAST_CHECKED_BY_MODERATOR_AT_TIME TIMESTAMP,* |2 {. v. Y. m, s1 ^: _$ R2 \6 R+ k
    CONSTRAINT Question_PK PRIMARY KEY(QUESTION_ID)( S& \2 f- u2 a$ x$ Q+ Q
);8 m3 ^! k- M& R+ e
CREATE TABLE so.Tag
0 T" R( s4 ], @' z(
% v' Z. V, l- N' v    TAG_ID SERIAL NOT NULL,' @5 R* Y# p' K0 G  k% ^
    TAG_NAME CHARACTER VARYING(20) NOT NULL,
) {4 Q* \* b$ D  h1 @) o$ M2 A    CONSTRAINT Tag_PK PRIMARY KEY(TAG_ID),
, `: o: p% P: [# n2 A1 M' c    CONSTRAINT Tag_UC UNIQUE(TAG_NAME)* p+ u( R( }4 [
);# r# Y. J2 \* U
CREATE TABLE so.QuestionTaggedTag
$ N) }  m" p6 T+ I9 t5 p  E! \9 U(
/ ~/ X- ^. W3 F    QUESTION_ID INTEGER NOT NULL,
* i: J. U& Z& {; m* [    TAG_ID INTEGER NOT NULL,
# l  O$ Y1 ]+ r' Q" k. x, X    CONSTRAINT QuestionTaggedTag_PK PRIMARY KEY(QUESTION_ID, TAG_ID)
* }* W; S+ E; d# p' H4 X);5 Q$ |, D6 M4 c: Y
CREATE TABLE so.Answer
2 t1 p6 R! A4 t0 m) M: E! [(
* ]3 x9 l+ y: N1 L    ANSWER_ID SERIAL NOT NULL,
& G1 @2 a1 v( e* T' I0 _; M8 g" K    BODY CHARACTER VARYING NOT NULL,% X# C$ x6 _* P8 @" C5 U+ N& @
    USER_ID INTEGER NOT NULL,& y; q  i8 e* h+ E" N, Y2 e
    QUESTION_ID INTEGER NOT NULL," a. \9 M* R( k4 v, j# L7 k
    CONSTRAINT Answer_PK PRIMARY KEY(ANSWER_ID)
' t' k: U1 g* z& S);
* k1 @' L: \- n+ T; n' kALTER TABLE so.Question
/ ^! v( }3 ^% M" {  W$ z% b- v$ m& w    ADD CONSTRAINT Question_FK FOREIGN KEY (USER_ID)
  S: e. W- b4 q5 N6 T& j    REFERENCES so."User" (USER_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;( y8 Z7 l* e5 c. E7 _( W1 E
ALTER TABLE so.QuestionTaggedTag ( p: B# s2 {) O( O4 G- t* g3 l4 `% z
    ADD CONSTRAINT QuestionTaggedTag_FK1 FOREIGN KEY (QUESTION_ID)
  O$ b7 p4 U1 r" a" f8 M    REFERENCES so.Question (QUESTION_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;
- d& z$ B2 u4 W$ H- ]) jALTER TABLE so.QuestionTaggedTag 9 `, d/ R/ z2 \' v- |
    ADD CONSTRAINT QuestionTaggedTag_FK2 FOREIGN KEY (TAG_ID) ) s) J% A  O! ?, I" H& {' j
    REFERENCES so.Tag (TAG_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;/ W" _2 u! S7 D* H) K, r
ALTER TABLE so.Answer 9 {' I  |0 e- f6 U
    ADD CONSTRAINT Answer_FK1 FOREIGN KEY (USER_ID) . m% k8 |" t1 @8 L
    REFERENCES so."User" (USER_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;
, O0 i: U3 U7 Q6 gALTER TABLE so.Answer : c, H$ V  U) D
    ADD CONSTRAINT Answer_FK2 FOREIGN KEY (QUESTION_ID)
. Y* ?) N2 b' T8 g. Q    REFERENCES so.Question (QUESTION_ID) ON DELETE RESTRICT ON UPDATE RESTRICT;6 p9 ~% W7 _1 D/ V% {3 o% H; }; P+ R
COMMIT WORK;6 `: f5 L* b4 U
请注意,现在有一个单独的Tag表TAG_ID作为主键。TAG_NAME是一个具有唯一性约束的单独列,可防止重复的标签。该QuestionTaggedTag表现在具有(QUESTION_ID,TAG_ID),这也是它的主键。. p$ f$ B" y% @# y, `4 A# Y$ P
我希望我不会在回答这个问题上走得太远,但是当我尝试编写较小的答案时,我一直不得不解开我以前的答案,而仅仅发布它似乎更简单。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则