1

指定された日に商品を配送するメーカーのリストがあります。たとえば、メーカーAは、月曜日と木曜日に商品を配達する場合があります。この情報を表示するページをデザインする必要があります。このページには基本的に月曜日から日曜日までの7つのチェックボックスがあり、メーカーはオン/オフを切り替えて希望の配達日を設定できます。

SQL Server 2008で作成しているテーブルには、主キーとして機能する整数である製造元IDと、納期を格納するフィールドが含まれています。

配達日に使用するのに最も適切なデータ型は何ですか?

4

2 に答える 2

2

1日が求められていると仮定します。

私が選ぶのはTINYINT;

SELECT DATEPART(WEEKDAY, GETDATE())

1〜7の範囲の整数になります(含む)

複数日が求められていると仮定します。

編集:n:nソリューションの方がパフォーマンスが良いと思いますが、確認されていません。

このような解決策を追求することに興味がありますか?このアプローチを選択したのは、n:nテーブルを使用するよりも「すっきり」していると感じたためです。要件を拡張するにつれて、拡張することができます。

USE tempdb
GO

IF OBJECT_ID('tempdb.dbo.Manufacturer') IS NOT NULL DROP TABLE Manufacturer
IF OBJECT_ID('tempdb.dbo.DeliveryDays') IS NOT NULL DROP TABLE DeliveryDays
CREATE TABLE [dbo].[Manufacturer](
    [ManufacturerID] [int] IDENTITY(1,1) NOT NULL,
    [Manufacturer] [varchar](50) NOT NULL,
    [DeliveryDaysBinScore] [int] NULL,
 CONSTRAINT [PK_Manufacturer] PRIMARY KEY CLUSTERED 
(
    [ManufacturerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE DeliveryDays
(
     WeekdayNum INT
    ,tDayName   VARCHAR(9)
    ,DayBinVal  INT
)
INSERT INTO DeliveryDays VALUES 
(1, 'Sunday', 1),
(2, 'Monday', 2),
(3, 'Tuesday', 4),
(4, 'Wednesday', 8),
(5, 'Thursday', 16),
(6, 'Friday', 32),
(7, 'Saturday', 64)

/*
    Sunday      = 1 = 1
    Monday      = 2 = 2
    Tuesday     = 3 = 4
    Wednesday   = 4 = 8
    Thursday    = 5 = 16
    Friday      = 6 = 32
    Saturday    = 7 = 64
*/

INSERT INTO Manufacturer VALUES
('ABC Co', 16 + 1), ('Boxer PTY', 64+8), ('ConsumeIT', 1+4+16)

SELECT *
FROM Manufacturer   M
JOIN DeliveryDays   D ON M.DeliveryDaysBinScore & D.DayBinVal != 0
于 2013-01-04T08:26:24.937 に答える
1

複数の配達日がある場合:

最良のアイデアは、7ビットフィールドを持つことかもしれません。これには、インデックス付けと、これらのフィールドでクエリを実行するときにスキャンする必要のあるレコードの量に関して、単一のINTまたはVARCHARとして格納するよりも利点があります。

完全を期すために、MySQLには可変長のバイナリフィールドがあることに注意してください(SQL-Serverは私が知る限りではありません)。

別の方法は、単一のINTフィールドを使用し、ビット単位の演算を使用してチェックする日を決定することです(または、実行時に値を簡単に確認できるようにする場合はVARCHARですがSELECT *、このための計算フィールドまたはストアドプロシージャはいつでも使用できます) 。

単品配達日:

0〜6または1〜7の値を持つINTを格納することをお勧めします。

于 2013-01-04T08:23:41.900 に答える