Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用asp.net在sql中创建高效的数据库设计?_C#_Asp.net_Sql Server_Database - Fatal编程技术网

C# 如何使用asp.net在sql中创建高效的数据库设计?

C# 如何使用asp.net在sql中创建高效的数据库设计?,c#,asp.net,sql-server,database,C#,Asp.net,Sql Server,Database,现在我仍然是数据库的初学者,并且仍然在学习所有关于它的知识。我的数据库设计有一个问题,我真的不知道该怎么办。基本上,我正在建立一个音乐商店的网站,有吉他和低音作为产品。现在,我的数据库中总共有六个品牌,包括在网页中显示的相应徽标图像。吉他和贝斯都可以使用该数据库检索所需品牌 brandIdnameimage 1ibanezyz.jpg 2Fenderabc.jpg 3Gibsonhjk.jpg 4PRSwyx.jpg 5Musicmancde.jpg 6ESPihl.jpg 现在,我将使用asp

现在我仍然是数据库的初学者,并且仍然在学习所有关于它的知识。我的数据库设计有一个问题,我真的不知道该怎么办。基本上,我正在建立一个音乐商店的网站,有吉他和低音作为产品。现在,我的数据库中总共有六个品牌,包括在网页中显示的相应徽标图像。吉他和贝斯都可以使用该数据库检索所需品牌

brandIdnameimage
1ibanezyz.jpg
2Fenderabc.jpg
3Gibsonhjk.jpg
4PRSwyx.jpg
5Musicmancde.jpg
6ESPihl.jpg

现在,我将使用asp repeater显示这些品牌的吉他。在这种情况下,吉他网页显示所有品牌没有问题,因为它有该品牌的所有产品。以下是吉他的aspx代码:

<asp:Content ID='Content1' ContentPlaceHolderID='ContentPlaceHolder1' Runat='Server'>

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="repeater_ItemDataBound" ItemType="brand" SelectMethod="GetBrandData"> 
    <ItemTemplate>
        <div class="one-third">
            <div>
             <asp:LinkButton ID="linkButton" OnClick="Repeater1_OnClick" runat="server" CommandArgument='<%# Item.brandId %>'>
                 <asp:Image ID="brandImage" runat="server" height="250px" width="300px" />
             </asp:LinkButton>
            </div>

        </div>
    </ItemTemplate>
 protected void Page_Load(object sender, EventArgs e)
{

}

public void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Image img = e.Item.FindControl("brandImage") as Image;
    img.ImageUrl = "../Images/Brands/" + ((brand)e.Item.DataItem).image;
}

public List<brand> GetBrandData()
{
    MusicStoreDBEntities obj = new MusicStoreDBEntities();
    List<brand> list = new List<brand>();
    list = (from g in obj.brands select g).ToList();

    return list;

}

这是吉他背后的代码:

<asp:Content ID='Content1' ContentPlaceHolderID='ContentPlaceHolder1' Runat='Server'>

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="repeater_ItemDataBound" ItemType="brand" SelectMethod="GetBrandData"> 
    <ItemTemplate>
        <div class="one-third">
            <div>
             <asp:LinkButton ID="linkButton" OnClick="Repeater1_OnClick" runat="server" CommandArgument='<%# Item.brandId %>'>
                 <asp:Image ID="brandImage" runat="server" height="250px" width="300px" />
             </asp:LinkButton>
            </div>

        </div>
    </ItemTemplate>
 protected void Page_Load(object sender, EventArgs e)
{

}

public void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Image img = e.Item.FindControl("brandImage") as Image;
    img.ImageUrl = "../Images/Brands/" + ((brand)e.Item.DataItem).image;
}

public List<brand> GetBrandData()
{
    MusicStoreDBEntities obj = new MusicStoreDBEntities();
    List<brand> list = new List<brand>();
    list = (from g in obj.brands select g).ToList();

    return list;

}
受保护的无效页面加载(对象发送方,事件参数e)
{
}
public void repeater_ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
图像img=e.Item.FindControl(“brandImage”)作为图像;
img.ImageUrl=“../Images/Brands/”+((brand)e.Item.DataItem).image;
}
公共列表GetBrandData()
{
MusicStoreDBEntities obj=新的MusicStoreDBEntities();
列表=新列表();
列表=(从obj.brands中的g选择g.ToList();
退货清单;
}
同时bass只能展示三个品牌,分别是Ibanez、Fender和Musicman。问题就从这里开始。它的aspx代码基本上与吉他相同,但我对sql查询做了此更改,因此它只能返回这三个品牌

public List<brand> GetBrandData()
{
    MusicStoreDBEntities obj = new MusicStoreDBEntities();
    List<brand> list = new List<brand>();
    list = (from g in obj.brands where g.name=="Ibanez"||g.name=="Fender"||g.name=="Musicman" select g).ToList();

    return list;

}
公共列表GetBrandData()
{
MusicStoreDBEntities obj=新的MusicStoreDBEntities();
列表=新列表();
列表=(从obj.brands中的g开始,其中g.name==“Ibanez”| | g.name==“Fender”| | g.name==“Musicman”选择g)。ToList();
退货清单;
}
我在该查询中有多个where子句,因此我可以检索这三个品牌。我真的觉得这不是最有效的方法,会造成问题,如果我想添加第七个品牌,我需要在bass网页上显示,那么我每次都需要手动编辑查询,这并不理想。我想知道是否有其他解决方案用于管理查询或数据库设计方面的解决方案


我希望你们能给我一些建议

如果这是您要存储的全部内容,您可以在数据库中添加另外两个字段 其中一个叫做吉他,当品牌适用于吉他时,有一个1(所以现在所有的都是),另一个叫做Bass的领域,在使用Bass的品牌上只有一个1

在过滤器中,您可以添加“其中g.Bass==1”

这将只返回Bass品牌

但是,如果您打算扩展仪器,则应创建一个单独的表格,将仪器类型与品牌联系起来

乙二醇

类型品牌 吉他1 吉他2 吉他3 吉他4 等 低音1 低音2 低音5


然后在where中将这两个表链接在一起。

看看我的数据库设计

CREATE TABLE Brands
(
BrandID INT IDENTITY CONSTRAINT Pk_Brands Primary Key
,Beandname Varchar(200)
)


CREATE TABLE InstrumentType
(
InstrumentTypeID INT IDENTITY CONSTRAINT Pk_InstrumentType Primary Key
,InstrumentName Varchar(200)
)


CREATE TABLE Products
(
ProductsID INT IDENTITY CONSTRAINT Pk_Products Primary Key
,BrandID INT 
,InstrumentTypeID INT
,ProductImage Varchar(100)
)

ALTER TABLE [dbo].[Products]  WITH CHECK ADD  CONSTRAINT [FK_Products__Brands] FOREIGN KEY([BrandID])
REFERENCES [dbo].[Brands] ([BrandID])
GO

ALTER TABLE [dbo].[Products]  WITH CHECK ADD  CONSTRAINT [FK_Products_InstrumentTypesID] FOREIGN KEY([InstrumentTypeID])
REFERENCES [dbo].[InstrumentType] ([InstrumentTypeID])
GO
初始样本数据

INSERT INTO Brands (Beandname)
SELECT 'Ibanez' UNION ALL
SELECT 'Fender' UNION ALL
SELECT 'PRS'    UNION ALL
SELECT 'ESP'    UNION ALL
SELECT 'Warwick'

Go
INSERT INTO InstrumentType(InstrumentName)

SELECT 'Guitar'    UNION ALL
SELECT 'Bass' 

INSERT INTO Products(InstrumentTypeID,BrandID,ProductImage)

SELECT 1 , 1,'xyz.jpg' UNION ALL
SELECT 2 , 1,'hyz.jpg' UNION ALL
SELECT 1 , 2,'abc.jpg' UNION ALL
SELECT 2 , 2,'fgh.jpg' UNION ALL
SELECT 1 , 3,'yui.jpg' UNION ALL
SELECT 1 , 4,'mbm.jpg' UNION ALL
SELECT 2 , 5,'omo.jpg'

SELECT * FROM Brands 
SELECT * FROM InstrumentType 
SELECT * FRom Products
使用下面的查询获取结果

SELECT 
 p.ProductsID
--,p.BrandID
,B.Beandname
--,p.InstrumentTypeID
,i.InstrumentName
,p.ProductImage

FROM Products P
INNER JOIN Brands B
    On B.BrandID=p.BrandID
INNER JOIN InstrumentType I
    On I.InstrumentTypeID=P.InstrumentTypeID
通过将参数传递到下面的Sp,将数据插入产品表

CREATE Procedure Usp_Products_Insert
(
@InstrumentTypeID INT,
@BrandID INT,
@ProductImage VARCHAR(100)
)           
AS
BEGIN
IF EXISTS(
        SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_NAME='Products'
        )
    Begin
        INSERT INTO Products(
                    InstrumentTypeID,
                    BrandID,
                    ProductImage)
        SELECT @InstrumentTypeID,
                @BrandID,
                @ProductImage
    END

END

EXEC Usp_Products_Insert @InstrumentTypeID=1
                        ,@BrandID=2
                        ,@ProductImage='TTTT.Jpg'

SELECT * FRom Products

在表InstrumentType中添加列。为每种乐器类型添加唯一值(1=吉他,2=贝司,3=齐塔,4=乌克莱莱,5=贝里姆鲍等)。现在,根据InstrumentType进行筛选。如果将来打算添加新类型,可能需要创建一个单独的表来维护这些值并加入查询。您不希望像这样硬编码品牌。你想要一张乐器台。在该表中,您将有一列表示仪器类型。此外,你会有一个品牌栏。然后你会在bass页面上查询你的数据,找到所有带有bass类型的乐器品牌。您当然不想为每种仪器类型创建新页面。这不是处理数据或编码的好方法。您需要使您的逻辑可扩展,这样您就不需要为新的仪器类型做任何事情。@SeanLange-但是如果一个品牌同时拥有这两种类型怎么办?例如,一个名为“Ibanez”的品牌既有吉他又有贝斯。我可以在我的数据库中像这样指定类型Brand | Guitar Ibanez | Bass Ibanez吗?重复这些品牌可以吗?为什么。如果您的仪表台上有一列表示品牌,另一列表示类型,则您的状态良好。您需要分离数据点,而不是将品牌和类型之类的内容混合到一条信息中。这是两条截然不同的数据。是的,这就是我在回答中的意思。例如,第1行的Type=guitart,Brand=Ibanez。第2行的Type=Bass,Brand=Ibanez,依此类推。类型和品牌实际上是分开的列。我对你评论的分析正确吗?如果没有,请提供一个简单的例子供我遵循。对不起,如果我很慢得到它。哇,这对我来说是一个非常有趣的设计。