我是数据库和sql的新手。我有一个问题,我有两个表都包含指向另一个主键的外键。我的问题是我有大量的元素,这些元素可以具有不同语言的多个名称,但是必须具有一个主要名称/语言。
alt text http://img688.imageshack.us/img688/1121/11768540.png

首先,我想知道这是否可行,还是我应该已经放弃了?显而易见的解决方案是在ElementName表中有一个额外的布尔字段来表示IsDefaultName,但它为查询和更新增加了一些额外的复杂性。如果这是最好的解决方案,那么如果设置了IsDefaultName并且该表已经具有相同的ElementIdIsDefaultName设置(或者我需要查询),我如何限制ElementName表不接受任何提交这个手动)?

我试图在这里使用LINQ to SQL。我用来尝试插入新项目的代码使用The INSERT statement conflicted with the FOREIGN KEY constraint "FK_ElementName_Element".在SubmitChanges上引发了一个异常,我可以理解为什么会这样,但是想知道是否有解决方案/更好的解决方案。

var db = new MyDBDataContext();
var element = new Element();
var elementName = new ElementName() {
    ElementName1 = "MyElement",
    Language = "English",
};
element.ElementName = elementName;

db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
db.SubmitChanges();

最佳答案

解决方案1

element
------------------
element_id
~....

element_name
------------------
element_name_id
fk_element_id
name
language_id
is_default_name  Default ( 0 )

Trigger:
if ( ( select count ( 1 ) from element_name where is_default_name = 1 ) > 1 )
BEGIN
    raisError ( 'only 1 element_name may be marked is_default_name = true.', 16, 1 );
END


解决方案2

element
------------------
element_id ( pk )
~....

element_name
------------------
element_name_id ( pk )
fk_element_id
name
language_id

element_name_default
------------------
fk_element_id
fk_element_name_id
( pk - fk_element_id, fk_element_name_id )


解决方案3

element
------------------
element_id
fk_element_name_id_default NULL
~....

element_name
------------------
element_name_id
fk_element_id
name
language_id

order of code:
* Insert to element_name
* update of element


我会坚持你所拥有的,因为那很好,只是:

db.Elements.InsertOnSubmit(element);
db.ElementNames.InsertOnSubmit(elementName);
//I don't know this syntax to say
//  set the property of element.fk_element_name_id_default
//  to the newly inserted elementName from above
db.Elements.?.?

关于c# - 如何处理相互/递归相关的表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3122092/

10-09 08:54