我花了一些时间来追查这个错误,但我终于找到了原因.我正在使用Rails框架为纸牌游戏建模.目前我的数据库(大多数)看起来像这样:
cards cards_games games
----- ----------- -----
id id id
c_type card_id ...
value game_id other_stuff
Run Code Online (Sandbox Code Playgroud)
Rails ActiveRecord card.rb和game.rb目前看起来像这样
#card.rb
class Card < ActiveRecord::Base
has_and_belongs_to_many :player
has_and_belongs_to_many :game
has_and_belongs_to_many :cardsInPlay, :class_name => "Rule"
end
Run Code Online (Sandbox Code Playgroud)
#game.rb
class Game < ActiveRecord::Base
has_and_belongs_to_many :cards
has_many :players
has_one :rules, :class_name => Rule
end
Run Code Online (Sandbox Code Playgroud)
当我尝试运行游戏并且有多个游戏(超过1个)时,我收到错误
ActiveRecord::StatementInvalid in GameController#start_game
# example
Mysql::Error: Duplicate entry '31' for key 1: INSERT INTO `cards_games` (`card_id`, `id`, `game_id`) VALUES (31, 31, 7)
Run Code Online (Sandbox Code Playgroud)
每次动作失败时,cardid == id.我认为,这与Rails如何将数据插入数据库有关.由于没有cardgames对象,我认为它只是将card_id拉入id并将其插入数据库.这可以正常工作,直到你有两张同一张牌的游戏,这违反了卡片游戏的主键约束.由于数据库比较丰富,我对此问题的第一个解决方案是尝试强制rails通过删除id并将cardid和gameid作为主键来遵循这种关系的"真实"定义.它没有用,因为迁移似乎无法处理两个主键(尽管Rails API说它可以做到这一点......很奇怪).另一个解决方案是省略INSERT INTO语句中的'id'列,让数据库处理自动增量.不幸的是,我也不知道该怎么做.
那么,还有另一种解决办法吗?是否有一些我不知道的漂亮的Rails技巧?或者这种结构在Rails中是不可能的?这真是令人沮丧,因为我 …
经过5年的中断后,我又回到了全职网络开发阶段.我以前的经验(没有活动记录或MVC)告诉我对我的数据库模式非常彻底.外键约束,唯一索引等......在你写意大利面条代码时真的可以帮到你.
在Active Record/MVC框架中工作时,社区是否仍然发现这些有用?
编辑
我主要担心的是在两个地方管理限制; 型号代码和数据库.这意味着重复工作,它可能会导致错误.即你对数据库中的某些字段有一个独特的约束,但模型不知道它?我猜相反的情况也是如此,你可能只是忘记将约束放在模型中,然后当你不想要它时你会有重复的数据.
我有一个关于对数据库中的外键列使用null与默认值的问题.在设计数据库时,我发现了很多关于null与默认值的相反意见,但不完全是外键(主要优点和缺点).
目前我正在设计一个新的数据库,它将为不同的Web应用程序和其他具有不同数据访问方法(ORM,存储过程)的系统存储大量数据,并且我希望尽可能在最低级别实现一般规则(数据库).(所以不要在以后的应用程序中担心这个规则).
举个例子,假设我有一个用户表,User其中包含国籍的外键列,NationalityID这是CountryID表的主键Country.
现在我有两个/三个选项:
答:我允许NationalityID列(以及数据库中所有其他类似的外键列)为空,只需坚持使用常见的方法检查null(在应用程序中应用规则)
要么
B:我为每个外键指定一个默认值,让我们说"-1",并在每个关系表中添加"-1"作为键,其他所有数据作为"无数据"(对于本例中的Country表格)我把CountryID为"-1"的列和CountryName我设置为"No data"的列.因此,每次我想知道用户的国籍时,我总是会得到没有额外代码规则的结果(我不需要检查它是否为空).
要么
C:我可以禁止外键的空值.但这确实是我想要避免的.(如果不是附加数据(用户国籍),我需要有一个存储至少基本数据(用户名)的选项)
那么B好的做法是不是?我在这里错过了什么?我通过这种方法获得了更多的收益吗?我可以遇到哪些问题(除了要小心在ID值为"-1"的关系表中总是有额外的列,表示"没有数据")?
您对外键默认值的好/坏经历是什么?
谢谢
sql-server nhibernate database-design foreign-keys default-value
我正在尝试使用关系窗口来查看MS-Access数据库中的表之间的关系.我隐藏了所有其他表,并在其中一个表中找到了一个外键,它应该链接到另一个带有主键的表,我需要跟踪的信息.
有没有办法列出Access中表的现有外键约束,就像MySQL中的SHOW CREATE TABLE语法一样?
我有一个kendoui网格列出索赔.其中一列是贷方,它是贷方表的外键引用.我想要的是能够在网格中显示贷方名称而不是其id引用.
我已按如下方式设置贷方数据源
var dsLenders = new kendo.data.DataSource({
transport: {
read: {
url: "../data/lenders/",
dataType: "jsonp"
},
parameterMap: function(options, operation) {
if (operation === "read") {
return options;
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
并且网格看起来像这样
$("#gridClaims").kendoGrid({
dataSource: claimData,
autoSync:true,
batch: true,
pageable: {
refresh: true,
pageSizes: true
},
filterable: true,
sortable: true,
selectable: "true",
editable: {
mode: "popup",
confirmation: "Are you sure you want to delete this record?",
template: $("#claimFormPopup").html()
},
navigable: true, // enables keyboard navigation in the grid
toolbar: ["create"], // …Run Code Online (Sandbox Code Playgroud) Eloquent可以有效地管理与Eloquent模型的所有关系.那么,我真的需要在数据库中维护外键关系吗?维护数据库级别的关系是否会对应用程序的性能产生任何额外影响,因为数据完整性已由ORM层管理?
我有两张桌子
State(StateID int,StateName string)
City(CityID int,StateID int,CityName string)
Run Code Online (Sandbox Code Playgroud)
我正在使用代码第一种方法开发MVC4.我用于州和城市模型的代码是 -
对于州:
[Key]
public int StateID{get;set;}
public string StateName{get;set;}
Run Code Online (Sandbox Code Playgroud)
对于城市:
[Key]
public int CityID{get;set;}
[ForeignKey("State")]
public string StateID{get;set;}
public virtual State State{get;set;}
Run Code Online (Sandbox Code Playgroud)
这段代码正在为状态表的StateID创建一个外键.我想要的只是工作,但由于我是MVC的新手,我得到以下代码也做同样的事情.
[ForeignKey("StateID")]
public string Stateid{get;set;}
public virtual State StateID{get;set;}
Run Code Online (Sandbox Code Playgroud)
这让我很难搞清楚做什么的正确方法...我们应该在ForeignKey Annotation中传递Model Class名称,即状态或它应该是属性,即StateID 我经历过有关此Annotation的各种问题.但我仍然不确定上述代码的区别.任何建议将不胜感激.
这是我的第一个数据库DB1的模型:
from django.db import models
class Company(models.Model):
name = models.CharField(max_length=100, null=True)
address = models.TextField(max_length=200, null=True)
website = models.CharField(max_length=200, null=True)
conatct_no = models.CharField(max_length=20, null=True)
email = models.EmailField(max_length=20, null=True)
logo = models.FileField(upload_to='logo/', blank=True, null=True)
created = models.DateTimeField('company created', auto_now_add=True)
updated = models.DateTimeField('company updated', auto_now=True, null=True)
def __unicode__(self): # Python 3: def __str__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
第二个数据库模型Db2:
from django.db import models
from leavebuddymaster.models import Company
class Department(models.Model):
company = models.ForeignKey(Company)
department_name = models.CharField(max_length=50, null=True)
created = models.DateTimeField('department created', auto_now_add=True)
updated = models.DateTimeField('department updated', auto_now=True, …Run Code Online (Sandbox Code Playgroud) 我们有一个超过62k行的表.我们正在运行一个非常简单的删除查询,需要45分钟才能完成:
DELETE FROM myTable WHERE createdtime < '2017-03-07 05:00:00.000'
Run Code Online (Sandbox Code Playgroud)
我们尝试过的事情:
1-在timestamp列上添加了一个索引,但没有帮助.
2-使用函数分批删除20或50行,这仍然非常慢.
3-删除引用此表及其自己的主键约束的所有外键约束,这有助于将时间减少到几秒但我们无法在生产数据库上安全地执行此操作,因为它将锁定表并防止读取并在事务运行时写入.
我拒绝相信这个查询通常需要很长时间才能完成.任何建议表示赞赏.
foreign-keys ×10
database ×2
annotations ×1
django ×1
eloquent ×1
gridview ×1
javascript ×1
jet ×1
kendo-ui ×1
laravel ×1
ms-access ×1
nhibernate ×1
oracle ×1
orm ×1
postgresql ×1
primary-key ×1
ruby ×1
sql ×1
sql-delete ×1
sql-server ×1