相关疑难解决方法(0)

如何在列上创建外键,其中每个记录可能引用多个表中的一列中的列?

我正在创建一个社交网络.它有几个实体,如新闻,照片,可以有评论.由于所有注释都具有相同的列并且行为方式相同,唯一的区别是它们的类型 - 新闻,照片或将来要添加的其他内容 - 我决定使用名为列的所有注释创建一个表type.它工作得很好,直到我决定将外键添加到我的数据库模式.

comment表具有一个柱parent,它是指idnewsphoto表,这取决于塔type.

问题是,我不能添加一个引用未知表的外键,甚至更多,它一次引用几个表.

整个数据库现在使用外键,除了表parent中的这一列comment.它困扰我,因为它是我无法添加外键的唯一地方.

我敢肯定我不能创造这样的外键; 我的数据库设计中的某些东西需要改变.我决定创建一个评论表,准备为将来的新实体添加新的评论类型 - 视频,音乐,文章等 - 当我想为所有评论添加一个新列时,不要遇到维护地狱.

如果我必须为每个注释类型创建一个单独的表,以便能够完全使用外键,我会这样做.但也许这个问题的另一个常见解决方案已经存在,我只是不知道它?

也许我应该创建某种链接表,将comment表与其他实体的表链接起来?但也许这个解决方案比为每个评论类型创建一个单独的表更复杂?

也许我应该在comment表中有几列,比如newsId,photoId我可以添加外键吗?

这些解决方案对我来说似乎并不优雅,或者我只是误解了一些东西.我对这个问题的全部看法可能是完全错误的.这就是我在这里的原因.请分享您的想法.

database database-design foreign-keys

7
推荐指数
1
解决办法
1026
查看次数

对这些实体之间的关系进行建模的最有效方法是什么?

我有一个包含实体的数据库,如下所示:

1. User entity
2. Event entity (musical concert etc.)
3. Ticket entity
3. Notification entity
Run Code Online (Sandbox Code Playgroud)
  • 通知实体与工单和事件都有直接关系(1:N [工单/事件:通知])。
  • 通知将存储在数据库中,用户可以通过通知选项卡访问它们。
  • 用户可以收到与其门票相关的通知(例如“我们刚刚将您的门票发送给您!”)或有关某些活动的通知(例如“活动 xy 即将推出!预订您的位置!”)。

我一直在思考三种可能的解决方案:

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)

sql database database-design entity relational-database

1
推荐指数
1
解决办法
1600
查看次数

同时多个表的外键

我在软件中使用 Firebird 数据库并发现了一个问题

\n\n

我有两张桌子,适合两种不同类型的客户:

\n\n
clientM(\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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

(长度是固定的,因为它是 M\xc3\xa9xico 中我期望用户输入的数据的标准)

\n\n

问题来了,我需要创建第三个表:

\n\n
clientPayment(\n\n    rfcClient varchar(13)\n\n    some other data\n\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且该字段必须有一个引用 clientM.rfcM 和 clientF.rfcF 的外键,因此我可以使用同一个表来存储来自两种类型客户的付款

\n\n

我可以让第三个表不带外键,但希望添加一个并避免用户输入不正确的数据

\n

sql firebird foreign-keys

0
推荐指数
1
解决办法
6237
查看次数