java容器之四_stack

Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来

Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用

[plain]  view plain  copy
  1. E push(E item)   
  2.          把项压入堆栈顶部。   
  3. E pop()   
  4.          移除堆栈顶部的对象,并作为此函数的值返回该对象。   
  5. E peek()   
  6.          查看堆栈顶部的对象,但不从堆栈中移除它。   
  7. boolean empty()   
  8.          测试堆栈是否为空。    
  9. int search(Object o)   
  10.          返回对象在堆栈中的位置,以 1 为基数。  

Stack本身通过扩展Vector而来,而Vector本身是一个可增长的对象数组( a growable array of objects)那么这个数组的哪里作为Stack的栈顶,哪里作为Stack的栈底?

答案只能从源代码中寻找,jdk1.6:

[java]  view plain  copy
  1. public class Stack<E> extends Vector<E> {  
  2.     /** 
  3.      * Creates an empty Stack. 
  4.      */  
  5.     public Stack() {  
  6.     }  
  7.   
  8.     /** 
  9.      * Pushes an item onto the top of this stack. This has exactly 
  10.      * the same effect as: 
  11.      * <blockquote><pre> 
  12.      * addElement(item)</pre></blockquote> 
  13.      * 
  14.      * @param   item   the item to be pushed onto this stack. 
  15.      * @return  the <code>item</code> argument. 
  16.      * @see     java.util.Vector#addElement 
  17.      */  
  18.     public E push(E item) {  
  19.     addElement(item);  
  20.   
  21.     return item;  
  22.     }  
  23.   
  24.     /** 
  25.      * Removes the object at the top of this stack and returns that 
  26.      * object as the value of this function. 
  27.      * 
  28.      * @return     The object at the top of this stack (the last item 
  29.      *             of the <tt>Vector</tt> object). 
  30.      * @exception  EmptyStackException  if this stack is empty. 
  31.      */  
  32.     public synchronized E pop() {  
  33.     E   obj;  
  34.     int len = size();  
  35.   
  36.     obj = peek();  
  37.     removeElementAt(len - 1);  
  38.   
  39.     return obj;  
  40.     }  
  41.   
  42.     /** 
  43.      * Looks at the object at the top of this stack without removing it 
  44.      * from the stack. 
  45.      * 
  46.      * @return     the object at the top of this stack (the last item 
  47.      *             of the <tt>Vector</tt> object). 
  48.      * @exception  EmptyStackException  if this stack is empty. 
  49.      */  
  50.     public synchronized E peek() {  
  51.     int len = size();  
  52.   
  53.     if (len == 0)  
  54.         throw new EmptyStackException();  
  55.     return elementAt(len - 1);  
  56.     }  
  57.   
  58.     /** 
  59.      * Tests if this stack is empty. 
  60.      * 
  61.      * @return  <code>true</code> if and only if this stack contains 
  62.      *          no items; <code>false</code> otherwise. 
  63.      */  
  64.     public boolean empty() {  
  65.     return size() == 0;  
  66.     }  
  67.   
  68.     /** 
  69.      * Returns the 1-based position where an object is on this stack. 
  70.      * If the object <tt>o</tt> occurs as an item in this stack, this 
  71.      * method returns the distance from the top of the stack of the 
  72.      * occurrence nearest the top of the stack; the topmost item on the 
  73.      * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt> 
  74.      * method is used to compare <tt>o</tt> to the 
  75.      * items in this stack. 
  76.      * 
  77.      * @param   o   the desired object. 
  78.      * @return  the 1-based position from the top of the stack where 
  79.      *          the object is located; the return value <code>-1</code> 
  80.      *          indicates that the object is not on the stack. 
  81.      */  
  82.     public synchronized int search(Object o) {  
  83.     int i = lastIndexOf(o);  
  84.   
  85.     if (i >= 0) {  
  86.         return size() - i;  
  87.     }  
  88.     return -1;  
  89.     }  
  90.   
  91.     /** use serialVersionUID from JDK 1.0.2 for interoperability */  
  92.     private static final long serialVersionUID = 1224463164541339165L;  
  93. }  

通过peek()方法注释The object at the top of this stack (the last item of the Vector object,可以发现数组(Vector)的最后一位即为Stack的栈顶

pop、peek以及search方法本身进行了同步

push方法调用了父类的addElement方法

empty方法调用了父类的size方法

Vector类为线程安全类

综上,Stack类为线程安全类(多个方法调用而产生的数据不一致问题属于原子性问题的范畴)

[java]  view plain  copy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Stack<String> s = new Stack<String>();  
  4.         System.out.println("------isEmpty");  
  5.         System.out.println(s.isEmpty());  
  6.         System.out.println("------push");  
  7.         s.push("1");  
  8.         s.push("2");  
  9.         s.push("3");  
  10.         Test.it(s);  
  11.         System.out.println("------pop");  
  12.         String str = s.pop();  
  13.         System.out.println(str);  
  14.         Test.it(s);  
  15.         System.out.println("------peek");  
  16.         str = s.peek();  
  17.         System.out.println(str);  
  18.         Test.it(s);  
  19.         System.out.println("------search");  
  20.         int i = s.search("2");  
  21.         System.out.println(i);  
  22.         i = s.search("1");  
  23.         System.out.println(i);  
  24.         i = s.search("none");  
  25.         System.out.println(i);  
  26.     }  
  27.       
  28.     public static void it(Stack<String> s){  
  29.         System.out.print("iterator:");  
  30.         Iterator<String> it = s.iterator();  
  31.         while(it.hasNext()){  
  32.             System.out.print(it.next()+";");  
  33.         }  
  34.         System.out.print("\n");  
  35.     }  
  36. }  

结果:

[sql]  view plain  copy
  1. ------isEmpty  
  2. true            
  3. ------push  
  4. iterator:1;2;3;    
  5. ------pop  
  6. 3       --栈顶是数组最后一个  
  7. iterator:1;2;  
  8. ------peek  
  9. 2       --pop取后删掉,peek只取不删  
  10. iterator:1;2;  
  11. ------search      
  12. 1       --以1为基数,即栈顶为1  
  13. 2       --和栈顶见的距离为2-1=1  
  14. -1      --不存在于栈中  

Stack并不要求其中保存数据的唯一性,当Stack中有多个相同的item时,调用search方法,只返回与查找对象equal并且离栈顶最近的item与栈顶间距离(见源码中search方法说明)

### 1. 平台用户表(t_stack_user) **作用**:扩展系统用户的社区属性(如个人简介、关注数等),关联系统用户表(`t_sys_user`) ```sql CREATE TABLE "public"."t_stack_user" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "sys_user_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 关联系统用户表ID "bio" varchar(500) COLLATE "pg_catalog"."default", -- 个人简介(技术领域、擅长方向等) "personal_url" varchar(255) COLLATE "pg_catalog"."default", -- 个人主页/博客地址 "follow_count" int4 DEFAULT 0, -- 关注的用户数 "follower_count" int4 DEFAULT 0, -- 粉丝数 "article_count" int4 DEFAULT 0, -- 发布的文章数 "is_verified" bool DEFAULT false, -- 是否认证开发者(如"前端专家") "verified_info" varchar(100) COLLATE "pg_catalog"."default", -- 认证信息(如"Java高级工程师") CONSTRAINT "pk_t_stack_user" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_user_sys" FOREIGN KEY ("sys_user_id") REFERENCES "public"."t_sys_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_user" IS '平台用户表(系统用户的社区属性扩展)'; COMMENT ON COLUMN "public"."t_stack_user"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_user"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_user"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_user"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_user"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_user"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_user"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_user"."tenant_id" IS '多租户标识(与系统用户一致)'; COMMENT ON COLUMN "public"."t_stack_user"."sys_user_id" IS '关联系统用户表的唯一ID(外键)'; COMMENT ON COLUMN "public"."t_stack_user"."bio" IS '个人简介(技术社区展示用)'; COMMENT ON COLUMN "public"."t_stack_user"."personal_url" IS '个人博客/外部主页链接'; COMMENT ON COLUMN "public"."t_stack_user"."follow_count" IS '关注的用户总数'; COMMENT ON COLUMN "public"."t_stack_user"."follower_count" IS '粉丝总数'; COMMENT ON COLUMN "public"."t_stack_user"."article_count" IS '发布的技术文章总数'; COMMENT ON COLUMN "public"."t_stack_user"."is_verified" IS '是否为认证开发者'; COMMENT ON COLUMN "public"."t_stack_user"."verified_info" IS '认证信息(如"云计算专家")'; -- 索引:通过系统用户ID快速查询平台用户信息 CREATE UNIQUE INDEX "uk_t_stack_user_sys_id" ON "public"."t_stack_user" USING btree ("sys_user_id") WHERE "is_delete" = false; ``` ### 2. 技术文章表(t_stack_article) **作用**:存储用户发布的技术文章核心内容,关联平台用户(作者) ```sql CREATE TABLE "public"."t_stack_article" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "title" varchar(255) COLLATE "pg_catalog"."default" NOT NULL, -- 文章标题 "content" text COLLATE "pg_catalog"."default" NOT NULL, -- 文章内容(富文本) "summary" varchar(500) COLLATE "pg_catalog"."default", -- 摘要(列表页展示) "cover_img" varchar(512) COLLATE "pg_catalog"."default", -- 封面图URL "author_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 作者(平台用户ID) "column_id" varchar(32) COLLATE "pg_catalog"."default", -- 所属专栏(可为空) "status" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, -- 状态:DRAFT(草稿)/PUBLISHED(发布)/OFFLINE(下架) "view_count" int4 DEFAULT 0, -- 阅读量 "like_count" int4 DEFAULT 0, -- 点赞数 "comment_count" int4 DEFAULT 0, -- 评论数 "collect_count" int4 DEFAULT 0, -- 收藏数 "publish_time" timestamp(6), -- 发布时间(草稿转发布时更新) CONSTRAINT "pk_t_stack_article" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_article_author" FOREIGN KEY ("author_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_article" IS '技术文章表(核心内容载体)'; COMMENT ON COLUMN "public"."t_stack_article"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_article"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_article"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_article"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_article"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_article"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_article"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_article"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_article"."title" IS '文章标题'; COMMENT ON COLUMN "public"."t_stack_article"."content" IS '文章内容(支持Markdown/HTML)'; COMMENT ON COLUMN "public"."t_stack_article"."summary" IS '文章摘要(500字以内)'; COMMENT ON COLUMN "public"."t_stack_article"."cover_img" IS '封面图片URL(可选)'; COMMENT ON COLUMN "public"."t_stack_article"."author_id" IS '作者ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_article"."column_id" IS '所属专栏ID(关联专栏表,可为空)'; COMMENT ON COLUMN "public"."t_stack_article"."status" IS '文章状态'; COMMENT ON COLUMN "public"."t_stack_article"."view_count" IS '累计阅读次数'; COMMENT ON COLUMN "public"."t_stack_article"."like_count" IS '累计点赞次数'; COMMENT ON COLUMN "public"."t_stack_article"."comment_count" IS '累计评论次数'; COMMENT ON COLUMN "public"."t_stack_article"."collect_count" IS '累计收藏次数'; COMMENT ON COLUMN "public"."t_stack_article"."publish_time" IS '首次发布时间'; -- 索引:优化作者文章查询、状态筛选 CREATE INDEX "idx_t_stack_article_author" ON "public"."t_stack_article" USING btree ("author_id", "is_delete"); CREATE INDEX "idx_t_stack_article_status" ON "public"."t_stack_article" USING btree ("status", "is_delete", "publish_time"); ``` ### 3. 技术专栏表(t_stack_column) **作用**:聚合同类文章的专栏(如“Java进阶系列”),关联专栏创建者 ```sql CREATE TABLE "public"."t_stack_column" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, -- 专栏名称 "description" varchar(500) COLLATE "pg_catalog"."default", -- 专栏描述 "cover_img" varchar(512) COLLATE "pg_catalog"."default", -- 专栏封面图 "creator_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 创建者(平台用户ID) "article_count" int4 DEFAULT 0, -- 专栏内文章数量 "status" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, -- 状态:ENABLED(启用)/DISABLED(禁用) CONSTRAINT "pk_t_stack_column" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_column_creator" FOREIGN KEY ("creator_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_column" IS '技术专栏表(文章聚合容器)'; COMMENT ON COLUMN "public"."t_stack_column"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_column"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_column"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_column"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_column"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_column"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_column"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_column"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_column"."name" IS '专栏名称(如"SpringCloud实战")'; COMMENT ON COLUMN "public"."t_stack_column"."description" IS '专栏简介(说明专栏主题)'; COMMENT ON COLUMN "public"."t_stack_column"."cover_img" IS '专栏封面图片URL'; COMMENT ON COLUMN "public"."t_stack_column"."creator_id" IS '创建者ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_column"."article_count" IS '专栏包含的文章总数'; COMMENT ON COLUMN "public"."t_stack_column"."status" IS '专栏状态'; -- 索引:同一用户的专栏名称唯一 CREATE UNIQUE INDEX "uk_t_stack_column_name" ON "public"."t_stack_column" USING btree ("name", "creator_id") WHERE "is_delete" = false; CREATE INDEX "idx_t_stack_column_creator" ON "public"."t_stack_column" USING btree ("creator_id", "is_delete"); ``` ### 4. 技术标签表(t_stack_tag) **作用**:文章分类标签(如“Java”“分布式”),支持内容检索 ```sql CREATE TABLE "public"."t_stack_tag" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL, -- 标签名称(如"Python") "description" varchar(200) COLLATE "pg_catalog"."default", -- 标签描述 "use_count" int4 DEFAULT 0, -- 被文章使用的次数 CONSTRAINT "pk_t_stack_tag" PRIMARY KEY ("id") ); COMMENT ON TABLE "public"."t_stack_tag" IS '技术标签表(内容分类标识)'; COMMENT ON COLUMN "public"."t_stack_tag"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_tag"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_tag"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_tag"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_tag"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_tag"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_tag"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_tag"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_tag"."name" IS '标签名称(唯一)'; COMMENT ON COLUMN "public"."t_stack_tag"."description" IS '标签说明(如"Java编程语言相关内容")'; COMMENT ON COLUMN "public"."t_stack_tag"."use_count" IS '关联的文章总数'; -- 索引:标签名称唯一(同一租户内) CREATE UNIQUE INDEX "uk_t_stack_tag_name" ON "public"."t_stack_tag" USING btree ("name", "tenant_id") WHERE "is_delete" = false; ``` ### 5. 文章标签关联表(t_stack_article_tag) **作用**:关联文章与标签(多对多关系) ```sql CREATE TABLE "public"."t_stack_article_tag" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "article_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 文章ID "tag_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 标签ID CONSTRAINT "pk_t_stack_article_tag" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_article_tag_article" FOREIGN KEY ("article_id") REFERENCES "public"."t_stack_article" ("id") ON DELETE CASCADE, CONSTRAINT "fk_t_stack_article_tag_tag" FOREIGN KEY ("tag_id") REFERENCES "public"."t_stack_tag" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_article_tag" IS '文章标签关联表(多对多映射)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_article_tag"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_article_tag"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_article_tag"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_article_tag"."article_id" IS '文章ID(关联文章表)'; COMMENT ON COLUMN "public"."t_stack_article_tag"."tag_id" IS '标签ID(关联标签表)'; -- 索引:同一文章不能重复关联同一标签 CREATE UNIQUE INDEX "uk_t_stack_article_tag_relation" ON "public"."t_stack_article_tag" USING btree ("article_id", "tag_id") WHERE "is_delete" = false; ``` ### 6. 文章评论表(t_stack_comment) **作用**:存储用户对文章的评论及回复(支持多级回复) ```sql CREATE TABLE "public"."t_stack_comment" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "article_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 所属文章ID "parent_id" varchar(32) COLLATE "pg_catalog"."default", -- 父评论ID(回复时关联,null为一级评论) "content" varchar(1000) COLLATE "pg_catalog"."default" NOT NULL, -- 评论内容 "commenter_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 评论人(平台用户ID) "like_count" int4 DEFAULT 0, -- 评论点赞数 CONSTRAINT "pk_t_stack_comment" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_comment_article" FOREIGN KEY ("article_id") REFERENCES "public"."t_stack_article" ("id") ON DELETE CASCADE, CONSTRAINT "fk_t_stack_comment_user" FOREIGN KEY ("commenter_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT, CONSTRAINT "fk_t_stack_comment_parent" FOREIGN KEY ("parent_id") REFERENCES "public"."t_stack_comment" ("id") ON DELETE CASCADE ); COMMENT ON TABLE "public"."t_stack_comment" IS '文章评论表(支持多级回复)'; COMMENT ON COLUMN "public"."t_stack_comment"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_comment"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_comment"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_comment"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_comment"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_comment"."is_delete" IS '是否删除(true-删除,false-正常)'; COMMENT ON COLUMN "public"."t_stack_comment"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_comment"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_comment"."article_id" IS '所属文章ID(关联文章表)'; COMMENT ON COLUMN "public"."t_stack_comment"."parent_id" IS '父评论ID(自关联,null为一级评论)'; COMMENT ON COLUMN "public"."t_stack_comment"."content" IS '评论内容(1000字以内)'; COMMENT ON COLUMN "public"."t_stack_comment"."commenter_id" IS '评论人ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_comment"."like_count" IS '评论被点赞次数'; -- 索引:优化文章评论查询、评论回复查询 CREATE INDEX "idx_t_stack_comment_article" ON "public"."t_stack_comment" USING btree ("article_id", "is_delete", "create_time"); CREATE INDEX "idx_t_stack_comment_parent" ON "public"."t_stack_comment" USING btree ("parent_id", "is_delete"); ``` ### 7. 点赞记录表(t_stack_like) **作用**:记录用户对文章/评论的点赞行为(防重复点赞) ```sql CREATE TABLE "public"."t_stack_like" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "relate_type" varchar(20) COLLATE "pg_catalog"."default" NOT NULL, -- 关联类型:ARTICLE(文章)/COMMENT(评论) "relate_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 关联ID(文章/评论ID) "user_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 点赞用户(平台用户ID) CONSTRAINT "pk_t_stack_like" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_like_user" FOREIGN KEY ("user_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_like" IS '点赞记录表(支持文章/评论点赞)'; COMMENT ON COLUMN "public"."t_stack_like"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_like"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_like"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_like"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_like"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_like"."is_delete" IS '是否取消点赞(true-取消,false-有效)'; COMMENT ON COLUMN "public"."t_stack_like"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_like"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_like"."relate_type" IS '关联类型(ARTICLE/COMMENT)'; COMMENT ON COLUMN "public"."t_stack_like"."relate_id" IS '关联的文章ID或评论ID'; COMMENT ON COLUMN "public"."t_stack_like"."user_id" IS '点赞用户ID(关联平台用户表)'; -- 索引:同一用户对同一内容只能点赞一次 CREATE UNIQUE INDEX "uk_t_stack_like_unique" ON "public"."t_stack_like" USING btree ("user_id", "relate_type", "relate_id") WHERE "is_delete" = false; ``` ### 8. 文章收藏表(t_stack_collection) **作用**:记录用户收藏文章的行为(防重复收藏) ```sql CREATE TABLE "public"."t_stack_collection" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "article_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 被收藏文章ID "user_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 收藏用户(平台用户ID) "collection_time" timestamp(6) NOT NULL, -- 收藏时间 CONSTRAINT "pk_t_stack_collection" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_collection_article" FOREIGN KEY ("article_id") REFERENCES "public"."t_stack_article" ("id") ON DELETE CASCADE, CONSTRAINT "fk_t_stack_collection_user" FOREIGN KEY ("user_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_collection" IS '文章收藏表'; COMMENT ON COLUMN "public"."t_stack_collection"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_collection"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_collection"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_collection"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_collection"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_collection"."is_delete" IS '是否取消收藏(true-取消,false-有效)'; COMMENT ON COLUMN "public"."t_stack_collection"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_collection"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_collection"."article_id" IS '被收藏的文章ID(关联文章表)'; COMMENT ON COLUMN "public"."t_stack_collection"."user_id" IS '收藏用户ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_collection"."collection_time" IS '收藏的具体时间'; -- 索引:同一用户不能重复收藏同一文章 CREATE UNIQUE INDEX "uk_t_stack_collection_unique" ON "public"."t_stack_collection" USING btree ("user_id", "article_id") WHERE "is_delete" = false; ``` ### 9. 用户关注表(t_stack_follow) **作用**:记录用户之间的关注关系(如A关注B) ```sql CREATE TABLE "public"."t_stack_follow" ( "id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, "creater" varchar(32) COLLATE "pg_catalog"."default", "create_time" timestamp(6), "updater" varchar(32) COLLATE "pg_catalog"."default", "update_time" timestamp(6), "is_delete" bool DEFAULT false, "version" int4 DEFAULT 0, "tenant_id" varchar(32) COLLATE "pg_catalog"."default", "follower_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 关注者(主动关注的用户) "followed_id" varchar(32) COLLATE "pg_catalog"."default" NOT NULL, -- 被关注者(被关注的用户) "follow_time" timestamp(6) NOT NULL, -- 关注时间 CONSTRAINT "pk_t_stack_follow" PRIMARY KEY ("id"), CONSTRAINT "fk_t_stack_follow_follower" FOREIGN KEY ("follower_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT, CONSTRAINT "fk_t_stack_follow_followed" FOREIGN KEY ("followed_id") REFERENCES "public"."t_stack_user" ("id") ON DELETE RESTRICT ); COMMENT ON TABLE "public"."t_stack_follow" IS '用户关注表(记录关注关系)'; COMMENT ON COLUMN "public"."t_stack_follow"."id" IS '唯一标识'; COMMENT ON COLUMN "public"."t_stack_follow"."creater" IS '创建人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_follow"."create_time" IS '创建时间'; COMMENT ON COLUMN "public"."t_stack_follow"."updater" IS '更新人(系统用户ID)'; COMMENT ON COLUMN "public"."t_stack_follow"."update_time" IS '更新时间'; COMMENT ON COLUMN "public"."t_stack_follow"."is_delete" IS '是否取消关注(true-取消,false-有效)'; COMMENT ON COLUMN "public"."t_stack_follow"."version" IS '版本号(乐观锁)'; COMMENT ON COLUMN "public"."t_stack_follow"."tenant_id" IS '多租户标识'; COMMENT ON COLUMN "public"."t_stack_follow"."follower_id" IS '关注者ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_follow"."followed_id" IS '被关注者ID(关联平台用户表)'; COMMENT ON COLUMN "public"."t_stack_follow"."follow_time" IS '关注的具体时间'; -- 索引:同一用户不能重复关注同一对象 CREATE UNIQUE INDEX "uk_t_stack_follow_unique" ON "public"."t_stack_follow" USING btree ("follower_id", "followed_id") WHERE "is_delete" = false; -- 索引:查询用户的关注列表/粉丝列表 CREATE INDEX "idx_t_stack_follow_follower" ON "public"."t_stack_follow" USING btree ("follower_id", "is_delete"); CREATE INDEX "idx_t_stack_follow_followed" ON "public"."t_stack_follow" USING btree ("followed_id", "is_delete");
最新发布
09-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值