我正在创建一个社交网络.它有几个实体,如新闻,照片,可以有评论.由于所有注释都具有相同的列并且行为方式相同,唯一的区别是它们的类型 - 新闻,照片或将来要添加的其他内容 - 我决定使用名为列的所有注释创建一个表type.它工作得很好,直到我决定将外键添加到我的数据库模式.
该comment表具有一个柱parent,它是指id的news或photo表,这取决于塔type.
问题是,我不能添加一个引用未知表的外键,甚至更多,它一次引用几个表.
整个数据库现在使用外键,除了表parent中的这一列comment.它困扰我,因为它是我无法添加外键的唯一地方.
我敢肯定我不能创造这样的外键; 我的数据库设计中的某些东西需要改变.我决定创建一个评论表,准备为将来的新实体添加新的评论类型 - 视频,音乐,文章等 - 当我想为所有评论添加一个新列时,不要遇到维护地狱.
如果我必须为每个注释类型创建一个单独的表,以便能够完全使用外键,我会这样做.但也许这个问题的另一个常见解决方案已经存在,我只是不知道它?
也许我应该创建某种链接表,将comment表与其他实体的表链接起来?但也许这个解决方案比为每个评论类型创建一个单独的表更复杂?
也许我应该在comment表中有几列,比如newsId,photoId我可以添加外键吗?
这些解决方案对我来说似乎并不优雅,或者我只是误解了一些东西.我对这个问题的全部看法可能是完全错误的.这就是我在这里的原因.请分享您的想法.
我有一个包含实体的数据库,如下所示:
1. User entity
2. Event entity (musical concert etc.)
3. Ticket entity
3. Notification entity
Run Code Online (Sandbox Code Playgroud)
我一直在思考三种可能的解决方案:
a) 通知实体具有以下结构:
id serial PRIMARY KEY,
.
.
ticketId integer REFERENCES tickets(id),
eventId integer REFERENCES events(id))
userId integer REFERENCES users(id) // this is present in all three solutions;
Run Code Online (Sandbox Code Playgroud)
这样,Notification 实体就拥有两个外键,但一次只填充其中一个(eventId 或 TicketId),另一个永远为空。
b) 通知实体仅具有与通知本身相关的列,它不包含任何外键(userId 除外)。
关系被提取到另外两个具有此结构的关系映射表中(对于通知-工单关系,同样适用于通知-事件,除了外键引用事件):
id serial PRIMARY KEY,
notificationId integer REFERENCES notifications(id),
ticketId integer REFERENCES tickets(id));
Run Code Online (Sandbox Code Playgroud)
这样,我们创建了类似接口的东西,并且不让通知实体知道任何有关关系的信息(它只有与通知本身和 userId 相关的属性),并且我们还有两个映射关系的附加表。
c) 将Notification实体分成两个不同的实体
(TicketNotification、EventNotification),每个实体具有相同的属性,但外键列不同。
- TicketNotification - …Run Code Online (Sandbox Code Playgroud) 我在软件中使用 Firebird 数据库并发现了一个问题
\n\n我有两张桌子,适合两种不同类型的客户:
\n\nclientM(\n\n rfcM varchar(12) primary key\n\n some other data \n\n)\n\nclientF(\n\n rfcF varchar(13) primary key\n\n some other data\n\n)\nRun Code Online (Sandbox Code Playgroud)\n\n(长度是固定的,因为它是 M\xc3\xa9xico 中我期望用户输入的数据的标准)
\n\n问题来了,我需要创建第三个表:
\n\nclientPayment(\n\n rfcClient varchar(13)\n\n some other data\n\n)\nRun Code Online (Sandbox Code Playgroud)\n\n并且该字段必须有一个引用 clientM.rfcM 和 clientF.rfcF 的外键,因此我可以使用同一个表来存储来自两种类型客户的付款
\n\n我可以让第三个表不带外键,但希望添加一个并避免用户输入不正确的数据
\n