我有一个表列消息列ID(主键,自动增量)和内容(文本).
我有一个表用户名列有用户名(主键,文本)和哈希.
一个发件人(用户)向许多收件人(用户)发送邮件,收件人(用户)可以收到许多邮件.
我创建了一个包含两列的表Messages_Recipients:MessageID(引用Messages表的ID列和Recipient(引用Users表中的用户名列).此表表示收件人和邮件之间的多对多关系.
所以,我的问题是这个.在将新消息存储在数据库中之后,将创建新消息的ID.但是,我如何保存对刚刚添加的MessageRow的引用以便检索这个新的MessageID?
我总是可以在数据库中搜索最后添加的行,但是这可能会在多线程环境中返回一个不同的行?
编辑:据我所知,SQLite你可以使用SELECT last_insert_rowid().但是如何从ADO.Net中调用此声明?
我的持久性代码(messages和messagesRecipients是DataTables):
public void Persist(Message message)
{
pm_databaseDataSet.MessagesRow messagerow;
messagerow=messages.AddMessagesRow(message.Sender,
message.TimeSent.ToFileTime(),
message.Content,
message.TimeCreated.ToFileTime());
UpdateMessages();
var x = messagerow;//I hoped the messagerow would hold a
//reference to the new row in the Messages table, but it does not.
foreach (var recipient in message.Recipients)
{
var row = messagesRecipients.NewMessages_RecipientsRow();
row.Recipient = recipient;
//row.MessageID= How do I find this??
messagesRecipients.AddMessages_RecipientsRow(row);
UpdateMessagesRecipients();//method not shown
}
}
private void UpdateMessages()
{
messagesAdapter.Update(messages);
messagesAdapter.Fill(messages);
}
Run Code Online (Sandbox Code Playgroud) create_table :categories_posts, :id => false do |t|
t.column :category_id, :integer, :null => false
t.column :post_id, :integer, :null => false
end
Run Code Online (Sandbox Code Playgroud)
我有一个连接表(如上所述),其中的列引用了相应的类别表和posts表.我想执行的唯一约束组合键CATEGORY_ID,POST_ID在categories_posts连接表.但是Rails不支持这个(我相信).
为了避免我的数据中具有相同category_id和post_id组合的重复行的可能性,在Rails中缺少复合键的最佳解决方法是什么?
我的假设是:
我正在使用Microsoft SQL Server Management Studio,在创建联结表时,我应该为联结表创建一个ID列,如果是这样,我还应该将它作为主键和标识列吗?或者只是为我加入多对多关系的表保留2列?
例如,如果这将是多对多表:
MOVIE
Movie_ID
Name
etc...
CATEGORY
Category_ID
Name
etc...
Run Code Online (Sandbox Code Playgroud)
我应该建立联结表:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Movie_Category_Junction_ID
Run Code Online (Sandbox Code Playgroud)
[并制作Movie_Category_Junction_ID我的主键并将其用作标识栏]?
要么:
MOVIE_CATEGORY_JUNCTION
Movie_ID
Category_ID
Run Code Online (Sandbox Code Playgroud)
[并且只留下没有主键或身份表的那个]?
我正在建模多对多关系,其中大部分时间只从一侧访问关系.它更像是一个层次结构,可以自上而下访问,而不是相反.
调查已经并且属于许多问题并且属于许多答案.
这两种关系必须是多对多的,因为同一个问题可以在不同的调查中重复使用,并在许多问题中得到相同的答案.这是一项要求.
标准M2M实现将使用两个连接表,surveys_questions和questions_answers.相反,我正在考虑使用PostgreSQL的整数数组存储question_ids在Survey和answer_idsQuestion中.
我们可以利用ANY运算符来查询与外键数组匹配的所有行.
我们如何使用SQL查询所有问题和问题的答案?
我们如何匹配使用外键数组返回的行的顺序?即.使用question_ids = [1,2,3]保证返回顺序为1,2,3的问题行.
与联结表相比,这如何表现性能(假设适当的索引,无论它们是什么)?
你能建议一下吗?有没有像这样建模M2M的资源?
更新
有人建议将数组外键的引用完整性添加到PostgreSQL 9.3,但它没有包括在内:http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/
关于使用外键数组PostgreSQL JOIN维护顺序的问题,数组类型与数组元素顺序,如何实现?
我正在观看一个截屏视频,作者说在连接表上有一个主键是不好的,但没有解释原因.
示例中的连接表在Rails迁移中定义了两个列,并且作者为每个列添加了索引但没有主键.
为什么在这个例子中有一个主键是不好的?
create_table :categories_posts, :id => false do |t|
t.column :category_id, :integer, :null => false
t.column :post_id, :integer, :null => false
end
add_index :categories_posts, :category_id
add_index :categories_posts, :post_id
Run Code Online (Sandbox Code Playgroud)
编辑:正如我提到的Cletus,即使对于连接表,我也能理解自动编号字段作为主键的潜在用处.但是,在上面列出的示例中,作者明确避免在"create table"语句中使用语法":id => false"创建自动编号字段.通常,Rails会自动将一个auto-number id字段添加到像这样的迁移中创建的表中,这将成为主键.但是对于这个连接表,作者专门阻止了它.我不确定他为什么决定采用这种方法.
我有三个表,其中2个是常规数据表,1个是多对多联结表.
两个数据表:
table products
product_id | product_name | product_color
-----------------------------------------
1 | Pear | Green
2 | Apple | Red
3 | Banana | Yellow
Run Code Online (Sandbox Code Playgroud)
和
table shops
shop_id | shop_location
--------------------------
1 | Foo street
2 | Bar alley
3 | Fitz lane
Run Code Online (Sandbox Code Playgroud)
我有一个包含shop_id's和product_id's 的联结表:
table shops_products
shop_id | product_id
--------------------
1 | 1
1 | 2
2 | 1
2 | 2
2 | 3
3 | 2
3 | 3
Run Code Online (Sandbox Code Playgroud)
我想从shop_id 3中的商店中选择数据.我从这里尝试了很多连接,左连接,内连接的例子,但我只是不知道我在这里做了什么以及出了什么问题.我的查询,但只是返回所有产品,无论他们是否在指定的商店是如下:
SELECT …Run Code Online (Sandbox Code Playgroud) 我有以下型号
public class PageConfig : Base
{
// Properties Etc..
public ICollection<Image> ScrollerImages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的方法是使用联结表{PageConfigID,ImageID}进行绑定.
在我的模型活页夹中我尝试了以下..
modelBuilder.Entity<PageConfig>()
.HasMany(x => x.ScrollerImages)
.WithMany()
.Map(x =>
{
x.ToTable("junc_PageConfigScrollerImages");
x.MapLeftKey("PageConfigID");
x.MapRightKey("ImageID");
});
Run Code Online (Sandbox Code Playgroud)
这导致图像的空集合.
如何将这些图像绑定到PageConfig模型?
编辑
大多数问题是由于用户错误.这发生在你身上......
检查数据库中的键约束是否已正确设置.
模型上的ICollection NEEDS是虚拟的.
c# entity-framework one-to-many model-binding junction-table
根据定义,连接表(桥接表/链接表)用于多对多关系,如下所示:
CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)
CREATE TABLE Permissions
(
PermissionKey varchar(50) PRIMARY KEY,
PermissionDescription varchar(500) NOT NULL
)
--This is the junction table.
CREATE TABLE UserPermissions
(
UserLogin varchar(50) REFERENCES Users (UserLogin),
PermissionKey varchar(50) REFERENCES Permissions (PermissionKey),
PRIMARY KEY (UserLogin, PermissionKey)
)
Run Code Online (Sandbox Code Playgroud)
但是它也不能像一对多关系那样容易使用,就像在这个例子中一个用户与许多订单相关联:
(我不太了解数据库,所以如果我误解了某些内容,请纠正我.)
CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)
CREATE TABLE Orders
( …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Entity Framework(代码优先)中创建多对多关系,根据以下帖子:MVC和Entity Framework中有限数量的选择的数据库设计?
但是,我无法让它正常工作,而且我确信我的做法非常简单.这是我尝试过的图表:

联结表的要点是我需要在关系中有一个额外的属性Level,所以我不能只顾问顾问和程序之间的直接关系.我在设计器中手动添加了ConsultantProgramLink实体,然后分别向Program和Consultant添加了关联,选择为每个添加FK,然后将它们作为主键.但是,当我这样做时,它不能像我预期的那样工作:
如果我在顾问和程序之间建立了直接关联,那么我可以在我的代码中引用Consultant.Programs.但现在使用联结表不起作用.有没有办法解决这个问题,或者我是否总是需要通过交汇点属性(Consultant.ConsultantProgramLink.Programs)?在任何情况下,即使我尝试通过交汇处属性也无济于事.我可以在我的代码中做Consultant.ConsultantProgramLink,但是另一个点没有给我导航属性程序(由于某种原因它也变成了简单的程序,为什么?如果我最终可以访问它们,我可以重命名它们吗?) .
那么我做错了什么?为什么我不能通过代码中的点表示法访问属性?
使用Entity Framework/LINQ,我需要以下帮助.
该数据库有一个People表,其标识列为PersonId.还有一个Skills表,其标识列为SkillId.这两个通过第三个表PeopleSkills连接,PeopleSkills有自己的标识列PeopleSkillsId,引用PersonId的外部列和引用SkillId的外部列.
我尝试编写的方法是传递一个List类型的参数,它包含我们正在寻找的任何技能.该方法应返回链接到输入参数列表中所有技能的List.如何在没有技能列表中的所有技能的情况下构建排除任何人的列表?
我遇到的问题是我的SQL经验非常少.我确实有很多其他编程经验,但SQL对我来说总是有点粗糙.我想过使用Join,但这不会起作用.即如果我的人具有技能A和B,并且搜索列表具有B&C的元素,则联接将在B上匹配它们并返回该人.我需要将这个人排除在外,因为他没有B&C.
我还想过迭代技能列表并构建一个过滤器,但这看起来很难看.这似乎是一个LINQ构建来处理的问题,使用List来查询另一个List,并且应该有一个优雅的解决方案.
junction-table ×10
database ×4
many-to-many ×3
one-to-many ×2
primary-key ×2
sql ×2
.net ×1
arrays ×1
asp.net ×1
c# ×1
join ×1
linq ×1
migration ×1
mysql ×1
postgresql ×1
sql-server ×1
sqlite ×1